-
数据的二进制表示&数据类型转换
2019-04-30 13:52:39位运算 其实这篇博客不是来讲位运算的,但是涉及到二进制,就顺便讲一下。数据的二进制表示
以下先以java中的byte类型为模板将(长度短,代码好写。。。)
byte b1 = (byte) 0b00000000;//0b表示后面的数据用二进制表示,0为八进制,0x为十六进制,十进制不带前缀 byte b2 = (byte) 0b10000000; byte b3 = (byte) 0b11111111; System.out.println(b1); System.out.println(b2); System.out.println(b3); //以上的输出结果为0、-128、-1
为何二进制与数据是这么对应的?个人理解是方便计算机进行运算。试想以下情况:
有一个数x的值为-128,我们使x加一变为-127,如果-128的二进制表示为0b11111111,那么-127应当为0b11111110,虽然值+1,但是二进制表示却是-1,底层不符合逻辑。所以逻辑一点,表面上既然+1,那底层最好也+1,所以-128用0b10000000来表示更合理,-127则相应的为0b10000001,底层的确比-128大1。
以这种方法表示,0b11111111则表示-1,而-1加一之后为0,二进制加一为0b100000000(8个0),因为byte长度为一个字节,即只有8bits,溢出的1被舍去,剩下为0b00000000,正好为0,符合-1+1=0。数据类型转换
上面的东西看完之后,我们进入正题。
之前我正在用java来实现通信,期间需要将各种数据与byte类型进行转换,而在将byte型转成int型数据时发现了一件事情。以如下代码为例:byte b = (byte) 0xff;//即255 System.out.println(b); System.out.println((int) b); System.out.println(b & 0xff); System.out.println((int) (b & 0xff)); System.out.println(b | 0x00); System.out.println((int) (b | 0x00));
三行输出分别为-1、-1、255、255、-1、-1
真是一件很令人头疼的事
我们先得出以下结论:- 是否进行强制类型转换对结果没有影响
- 让byte型数据与0进行或("|")运算不会使输出结果发生改变(即以byte类型输出,值域为-128~127)
- 让byte型数据与0xff(相对于8bits的数据来说即各位全是1)进行与("&")运算,会以比byte值域更大的域来输出,输出的数据明显超过了byte的值域
现在我们来看看下面这种情况:
byte b = (byte) 0xff; int num = (int) b; System.out.println(num ); System.out.println(num & 0xff); System.out.println(num & 0xffff); System.out.println(num & 0xffffffff); System.out.println(num | 0x00);
我们提前将byte类型转换成了int类型,输出结果如下:-1、255、65535、-1、-1
显然,num的二进制表示为0b111111111111111111111111(32个1)
我们又得出以下结论:- 将byte型转换成int型时(可以拓展为短数据类型转换成长数据类型),会保持值不变(负数高位补1,正数高位补0)
- 与上面相反,将int型转换成byte型时(长变短),如果发生溢值,则会舍弃高位,保留低位
以上就是我进行的全部测试
但是这里还有一个问题没有解决,希望有大神能给我一些帮助:
为什么b & 0xff和b | 0x00的值不一样,理论上两者都不会使值发生变化至此,我想讲的就讲完了,谢谢大家的阅读。
-
Java语言二进制补码与数据类型
2016-07-20 11:59:55补码运算规则:二进制最高位符号位,0正数,1负数 正数是本身,负数最高位不变号,其他为逐位取反再加1 两数相加时,符号位若进位,舍弃如0101(5)+1101(-3)=0010(2) 计算机正数与负数关系是取反加1 正数加...补码运算规则:二进制最高位符号位,0正数,1负数
正数是本身,负数最高位不变号,其他为逐位取反再加1
两数相加时,符号位若进位,舍弃如0101(5)+1101(-3)=0010(2)
计算机正数与负数关系是取反加1
正数加负数等于模(某种数据类型的总数)
Java的四种整数类型:byte int short long Java默认整数计算结果为int 证书的字面量是int型
若字面量超过int最大,则字面量为long后面要用L 或l表示long型
变量与数据类型:
byte b1=5;
byte b2=b1+3;
此时会出现语句错误,自己额类型中出现int:修改强转为:byte b2=(byte) (b1+3)或者int b2=b1+3;则可如果byte b2=1+3;,保存的是字节类型4,如果byte b2=155+3;在此错误(超过byte最大值127),应强制转换为byte b2=(byte) (155+3);
-
java二进制编码以及数据类型转换
2019-02-18 16:10:25一、 java的基本数据类型 1.基本数据类型位数(字节数) 位数 1字节(8位) 2字节(16位) 4字节(32位) 8字节(64位) 类型 byte short int long boolean char float...一、 java的基本数据类型
1.基本数据类型位数(字节数)
位数 1字节(8位) 2字节(16位) 4字节(32位) 8字节(64位) 类型 byte short int long boolean char float double 2.基本数据类型范围
需要记住byte的取值范围为 -128~127
(1)float的表示
符号位(1 bit) 指数(8 bit) 尾数(23 bit) (2)double的表示
符号位(1 bit) 指数(11 bit) 尾数(52 bit) 所以,float和double都是可以表示正数和负数的
3.原码、反码、补码
二进制最高位为符号位,正数的原码,反码,补码相同
负数的反码:符号位不变,其余位取反
负数的补码:在反码基础上加1
java中用补码表示负数(强转计算的时候用的到)
例1. 以7和-7为例
7的原码,反码,补码 都是 0000 0111 最高位0表示正数
-7的原码反码补码对比:
7的原码 : 0000 0111
-7的原码:1000 0111
-7的反码:1111 1000
-7的补码:1111 1001
例2. -1,0,1的表示
java用补码表示二进制数
-1的补码:1111 1111
0的补码: 0000 0000
1的补码: 0000 0001
二、数据类型转换
1.自动类型转换
(1)不同类型进行计算时,会自动向范围高的数据类型自动转换
特别注意:byte,short和char参加计算时,会自动提升为int参加计算
比如 A. byte+byte,会把两个byte转换成int参加计算
B.byte+short 也会把两个转换成int参加计算
(2)特别需要关注的是long和float的数据范围:
float是32位,long是64位的,但是float表示的数字范围要大于long
所以记得整型会向浮点型自动转换就行了
(3)举例:byte b, b1,b2; b1=1;b2=2; b=b1+b2;会报错吗?
分析:byte 类型参与计算的时候提升为int,所以b1+b2是int类型,赋值给byte类型b会报错
2.强制类型转换
A. 以 (byte)129 输出为-127为例
129在java中的二进制表示
0000 0000 | 0000 0000 | 0000 0000 | 1000 0001
(byte)129 强制转换后,byte是8位,则取最后8位 1000 00011000 0001是补码表示,最高位为符号位1说明是负数,
补码1000 0001对应反码为1000 0000
对应原码为1111 1111 还原数字为-127
B.以 (byte)150 输出为-106为例
150在java中的二进制表示
0000 0000 | 0000 0000 | 0000 0000 | 10010110强制转换为byte后,取最后8位 10010110
10010110是补码,最高位为1说明是负数,
10010110还原为反码减一,为10010101
10010101还原为原码为11101010,对应-106
C.第三个例子,short类型最大值32767, (byte)32769 和(short)32769的输出值
0000 0000 | 0000 0000 |1000 0000 | 0000 0001 //32769的二进制表示
0000 0001 //(byte)32769的二进制表示,最高位为0,正数,值为1
1000 0000 | 0000 0001 //(short)32769的二进制表示,最高位为1,负数,此为补码
1000 0000 | 0000 0000 //(short)32769的反码
1111 1111| 1111 1111 //(short)32769的原码,-32767
所以 (byte)32769为1 ,(short)32769输出为 -32767
三、总结
1.记住八种数据类型位数,字节数
2.byte的取值范围为 -128~127
3.自动类型转换顺序需要记住,float+long会向float转换,虽然long是64位的
4.byte ,char,short参加自动提升的时候,都是转变为int类型,byte+byte也是int类型
5.java中用补码表示负数,可以理解为java中的正数,负数都是用补码表示
6.强制转换时候,会取二进制数,对应的后几位为最终值(补码),然后计算补码对应的原值
-
No.3-Java二进制运算、数据类型的转换、分支结构
2021-01-01 17:59:45(如果范围大的转范围小的类型,那么会丢失精度,只截取相应位数,具体转化需要将类型用0和1的二进制表示,然后截取相应的位,向下转型。) 3、分支结构 单分支判断 //()内为true就执行{}内容,反之略过 if(){...1、二进制
-
原码
存在问题
-
反码
存在问题
- 补码
2、数据类型转换
输出cc的值,为30;
(如果范围大的转范围小的类型,那么会丢失精度,只截取相应位数,具体转化需要将类型用0和1的二进制表示,然后截取相应的位,向下转型。)3、分支结构
- 单分支判断
//()内为true就执行{}内容,反之略过 if(){ }
- 双分支判断
//if里面内容为true就执行第一个{}内容,反之执行else的 if(){ } else { }
- switch多分支
char ch ='a'; switch(ch){ case 'a': System.out.println(1); break; case 'b': System.out.println(2); break; //默认的选择,可有可无,以上的情况没对时候,default情况 default : System.out.println(3); }
-
-
深入理解ES5系列之数据类型-二进制位运算符
2020-03-08 15:38:55目录1 数据类型1.3 二进制位运算符1.3.1 进制或运算符1.3.2 二进制与运算符1.3.3 二进制否运算符1.3.4 异或运算符1.3.5 左移运算符1.3.6 右移运算符1.3.7 头部补零的右移运算符1.3.8 开关作用(应用场景) 1 数据... -
java float 二进制_java之二进制与数据类型
2021-02-28 14:03:43一、各数据类型的最大值和最小值整数:以byte为例,我们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。依照上面的推理方式可知总结下表:数据类型bit位取值... -
二进制数据类型
2014-04-16 16:57:16Binary 数据类型既可以是固定长度的(Binary),也可以是变长度的。 Binary[(n)] 是 n 位固定的二进制数据。其中,n 的取值范围是从 1 到 8000。其存储窨的大小是 n + 4 个字节。 Varbinary[(n... -
java 二进制 对象_java之二进制与数据类型(二)
2021-03-04 02:47:26一、各数据类型的最大值和最小值整数:以byte为例,我们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。依照上面的推理方式可知总结下表:数据类型bit位取值... -
java实现基础数据类型中二进制位操作算法
2017-08-24 16:18:52虽然一直很头疼二进制的问题,主要是搞不清各种类型和补码啊之类的,可是发现用二进制位的操作算法解决一些算法题还是很方便的。。。。。 首先,(1)最经典的,交换两个整形变量,一般做法是借助第三个变量,但是用... -
java sqlserver 二进制_SQL Server中实现二进制与字符类型之间的数据转换
2021-02-28 09:17:20在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(Byte)占用8个位(bit),高位4bit 表示一个十六进制数据,低位4bit 表示... -
二进制,位运算,以及java中的基本数据类型的存储
2020-10-20 14:23:48目录 JDK自带的进制转换 ...java中可以直接声明二进制、八进制、十进制、十六进制 例如: 二级制: int bin = 0b1100010; 八进制: int oct = 0142; 十进制: int dec = 98; 十六进制: int hex = 0x -
二进制与java中的数据类型
2020-01-04 21:50:54相同位的两个数字都为1,则为1;若有一个不为1,则为0. 例如一个数&1的结果就是取二进制的最末位。这可以用来判断一个整数的奇偶,最末位为1表示该数为奇数。 按位或(|) 相同位只要一个为1即为1。通常用于二进制... -
SQL Server中实现二进制与字符类型之间的数据转换
2021-01-19 22:13:38在工控应用上,返回的数据经常会以二进制的形成存储,而这些二进制数据又是以每4个bit表示一个十六进制的数据内容。解析的时候,往往是一个字节(Byte)占用8个位(bit),高位4bit 表示一个十六进制数据,低位4bit ... -
二进制 转换 .java_Java 基本数据类型二进制转换
2021-02-12 12:47:48概述本文主要介绍java基础类型的二进制转换和二进制的基本概念。二进制:1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1。2,在计算机当中其它进制的算法基本基于2进制,因为计算机只认识0和1,比如16进制数则意味... -
二进制 转换 .java_Java基础数据类型二进制转换
2021-02-12 12:47:51前言:本文主要介绍java基础类型的二进制转换和二进制的基本概念。二进制:1,二进制是以0和1为码,逢2进1,比如3=11=1*2+1。2,在计算机当中其它进制的算法基本基于2进制,因为计算机只认识0和1,比如16进制数则... -
Java进制转换, 数据类型, 运算符
2019-02-26 15:21:371:进制转换 转换规则: 先把数据的每一位上的系数乘以对应基数的次幂... 例: 十进制13对应的二进制数据是1101 二进制到十进制的技巧(8421码) 十进制到八进制: 除8取余,直到商为0,最后将余数反转 例: ... -
Java笔记:二进制与Java中的基本数据类型
2020-10-18 20:48:42二进制与Java中的基本数据类型 简介 二进制 0 1 逢二进一 二进制优点: 技术容易实现:高电压1,低电压0 传输可靠性高 适合逻辑运算:真1,假0 运算规则简单 二进制的缺点: 表示数时位数太多 可读性差,难于记忆... -
python读取二进制数据的位数称为_Python二进制文件读取并转换为浮点数详解
2020-12-04 11:47:57本文所用环境:Python 3.6.5 |Anaconda custom (64-bit)|引言由于某些原因,需要用python读取二进制文件,这里主要用到struct包,而这个包里面的方法主要是unpack、pack、calcsize。...二进制数据转... -
C语言基础 -5 二进制及数据类型存储
2020-06-02 06:05:32254的二进制:0000 0000 0000 0000 0000 0000 1111 1110 浮点数的存储:按照科学计数法方式存储。其中,表示方式为:第一位为0,后面为小数点后面的整数部分,再往后为指数部分,如下例:实际表示方式为0.314 * 10^... -
数据结构实例,链表存放二进制数,链表每个结点data域放一个二进制位,并实现对二进制数加1的运算,为什么...
2020-10-27 11:40:07/*从值域0被改为1的结点或最高二进制位的结点后移*/ while(r!=NULL) { /*将后面所有的结点的值域赋值为0*/ r->data=0; r=r->next; } } /*主函数*/ void main() { LinkList L_1,L_2; ... -
java之二进制与数据类型(二)
2018-02-02 15:54:30一、各数据类型的最大值和最小值整数:以byte为例,我们知道,byte共有8个bit位,最大值是0111111,最小值是10000000,用十进制来表示就是-128~127,即-2^7~2^7。依照上面的推理方式可知总结下表:数据类型bit位取值... -
Day02-进制与基本数据类型介绍
2019-10-03 08:27:13十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。 b.进位制/位置计数法是一种记数方式,故亦称进位记数法/位值计数法,可以用有限的数字符号代表所有的数值。可使用... -
进制转换&数据类型(1)
2017-05-03 13:22:00一: 进制转换 在计算机中, 数据都是以0和1来表示的 进制: 进位制 十进制: 数字由0~9这10个数字来表示, 逢10进1位 0 1 2 3 4 5 6 7 8 9 10 二进制: 数字由0和1这两个数字来表示, 逢2进1位 0 1 10 11 ... -
MySQL数据类型-二进制类型 (BLOB BINARY等)
2021-01-20 01:09:51MySQL 支持两类字符型数据:...下表中列出了 MySQL 中的二进制数据类型,括号中的M表示可以为其指定长度。 类型名称 说明 存储需求 BIT(M) 位字段类型 大约 (M+7)/8 字节 BINARY(M) 固定长度二进制字符串 M -
将一个int类型的数据转换为固定位数的二进制字符串,不足位补0
2018-07-05 10:00:21* @param num 需要转换的int类型数据 * @param digits 要转换的二进制位数,位数不足则在前面补0 * @return 二进制的字符串形式 */ public static String toBinary(int num, int digits) { String cove... -
mysql数据库二进制类型_Mysql 的 bit 类型与二进制的应用
2021-01-21 04:45:03bit类型首先,bit 类型不是对应true和false,也不是只有一位,而是0和1组成的串,即存储二进制的序列示例1 新建数据表testCREATE TABLE `test` (`id` int(20) NOT NULL,`codes` bit(8) NOT NULL,`remark` varchar(32... -
进制运算&数据类型&变量&运算符
2018-11-11 22:34:161.原码反码补码 (1)0正1负 (2)正数的原码反码补码都相同 (3)负数的反码是对其原码逐位取反...(1)整数型 (整数默认的数据类型int) byte 占一个字节 -128到127 注:byte为什么在-128到127之间,首先... -
二进制数据解析 + byteArray类型
2014-09-19 16:52:35二进制数据解析 + byteArray类型 一个字节有8位 0000 0000,并以二进制存在,故一个位置可以存储0,1数据。所以当位置全部填充为1的时候,为最大数字255. uint无符号型的整数型,int为有符号型的整数型。这...