关于Java数据类型的位
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Java数据类型的位相关的知识,希望对你有一定的参考价值。
位是什么意思?为什么char是2位,long是64等等,为什么是这么多位?
计算机计算的基本单位是bit,一般叫"字",也叫“位”。“字”的取值是0和1。.
而字对于一般的软件计算来说,太小了,所以将8个字放在一起形成byte(字节)。
这个byte也叫位,因为在java里一般不计算bit,byte被当做最基本得计算单位。
数据类型使用位数的多少,主要是为方便空间的控制。
一般我们整形计算的时候要使用int型的变量。
有的时候int型不能满足计算要求,就要使用long型的。
但是一旦声明了一个long型的变量,在这个变量的生存周期结束前,它就永远占用64byte的空间。这在早起对计算机的负担是很大的。所以设计了不同的变量类型,方便程序员控制程序运行空间的大小 参考技术A bit(位): 位只有 0 和 1 两个状态。
byte (字节): 1个字节 = 8位, 一个字节包含八个二进制位,应该表示为2^8。
我们来看看不同的位数分别能表示多少东西:
位数 最小 最大 表示
1 bit 0 1 2^1
2 bits 00 11 2^2, 4个数
3 bits 000 111 2^3, 8个数
8 bits 00000000 11111111 2^8, 256个数,这就是8位,也叫一个字节
9 bits 000000000 111111111 2^9, 512个数
… … … …
char 在java中是2个字节. java采用unicode, 2个字节(16位)来表示一个字符.
例:
char c = '我';
String str = "我";
byte[] bytes = str.getBytes(); //为什么这里要占用3个byte呢? 3个byte一共是3*8=24位;
那么char c 怎么又放得下?char是16位的啊??
原因:
byte[] bytes = str.getBytes();之后是3个字节,这里和前面的概念不一样.
java是用unicode来表示字符,"我"这个中文字符的unicode就是2个字节.String.getBytes(encoding)方法是获取指定编码的byte数组表示,通常gbk/gb2312是2个字节,utf-8是3个字节.如果不指定encoding则取系统默认的encoding.
64位指的是数值转换成2进制数的的位数,比如说byte类型是8位的,转换成2进制数类型可表示为11111111,64位顾名思义了。
long是整型,64位的长度全部用来表示整型的数字了。 参考技术B
一个字节是8位 long是8个字节 当然是64位咯
追问char表示的就是字节,那不是八位吗?
参考技术C 一个字节占8位。char在java中占2个字节,所以应该为16位才对,所以图片里面是错的。。
这是java虚拟机定义的,只要记下来就行。不同语言都不一样的,像c++的char是1位,占8个字节,int占2位,16个字节。追问
无奈了,这个是一个培训机构的Java视频截图的。
参考技术D 摘自网上,以这个为准吧。Java八种基本数据类型:
byte b; 1字节
short s; 2字节
int i; 4字节
long l; 8字节
char c; 2字节(C语言中是1字节)
float f; 4字节
double d; 8字节
boolean bool; false/true
1位 = 8字节。因此,你截的图除了char误以字节为单位,其他都是正确的。
参考资料:http://apps.hi.baidu.com/share/detail/17799655
Java的按位操作符
本文参考:Java的位操作符
Java的位操作符用来操作整数基本数据类型中的单个“比特”(bit),即代进制位。而我们知道比特就是0和1,那么,位操作就是对这些数据进行基本的操作。如果基本类型是char、byte或者short类型的数值进行移位处理,那么会转化成int类型,再进行移位的处理
Java的按位操作符
按位操作符会对两个参数对应的位执行布尔代数运算,并最终生成一个结果。这个操作符有与(&)、非(~)、或(|)、异或(^)。我们知道单位“比特”(bit),即代进制位,都是0和1,异或(^)可能比较复杂点,两个操作数的位中,相同则结果为0,不同则结果为1。那么最基本的逻辑就像下面这个样子。
1&1 → 1
1&0 → 0
~1 → 0
~0 → 1
1|1 → 1
1|0 → 1
1^0 → 1 (1为01,0为00,那么结果就是01,还是1)
1^1 → 0
Java的移位操作符
Java的移位操作符无非就是对二进制进行位移。
进行<<就是左移,也就是所有所有二进制往左边移动一个位,0010 0000 << 1 等于0100 0000
进行>>右移,也就是所有所有二进制往右边移动一个位,0010 0000 >> 1 等于0001 0000 。
可以试试下面的例子,整数型的也是变成二进制来计算:
class Test{
public static void main(String[] args){
int numInt1 = 3;
int numInt2 = -3;
System.out.println(numInt1<<1);
System.out.println(numInt1>>1);
System.out.println(numInt2<<1);
System.out.println(numInt2>>1);
}
}
/* 输出的结果如下(www.breakyizhan.com)
6 ---> 0000 0011<<1 , 变为0000 0110
1 ---> 0000 0011>>1 , 变为0000 0001...1后面的1被顶出去了,所以结果为1
-6 --> 1111 1101<<1 , 变为1111 1010 取反+1= 0000 0110 -6
-2 --> 1111 1101>>1 , 变为1111 1110 取反+1= 0000 0010 -2
*/
当然,还有Java的三元操作符,这部分的功能和if-else有点类似,具体更多内容可以看:
Java的三元操作符|Break易站
以上是关于关于Java数据类型的位的主要内容,如果未能解决你的问题,请参考以下文章