黑马程序员技术交流社区
标题:
位左移问题
[打印本页]
作者:
近夜之星
时间:
2013-11-1 22:29
标题:
位左移问题
在书上看了一道题:
public class MultByTwo
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
int i;
int num = 0xFFFFFFE;
for(i=0;i<4;i++)
{
num = num << 1;
System.out.println(num);
}
}
}
复制代码
输出结果:536870908
1073741816
2147483632
-32
就想知道最后一个-32怎么得出的?求大神讲解下,谢谢
作者:
魏-玉-彪
时间:
2013-11-1 23:25
public class MultByTwo
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
int i;
int num = 0xFFFFFFE;/*
1111111111111111111111111110
*/
for(i=0;i<4;i++)
{
num = num << 1;
System.out.println(num);
}
}
}
复制代码
268435454
= 0xFFFFFFE; //
1111111111111111111111111110
536870908
//
11111111111111111111111111100
1073741816
//
111111111111111111111111111000
2147483632
//
1111111111111111111111111110000
-32
//
11111111111111111111111111100000 最低位补0
请按任意键继续. . .
这个输入的是十六进制,按位左移操作的二进制,输出的是十进制,十进制,二进制码
对应如上, 学习操作符的时侯会涉及到这个问题
作者:
wangchao1686
时间:
2013-11-1 23:27
本帖最后由 wangchao1686 于 2013-11-1 23:41 编辑
在java中,基本数据类型int是32位的,就是占32个二进制位,所以int类型所能表示整数的范围也是有限制的.
int类型整数的表示的范围:
2[sup]-31[/sup]~2[sup]31[/sup]-1 即:-2147483648~2147483647
所以嘛,你也看到了,左移一位相当于原数乘2,当右移三次时已经是2147483632,再一次左移岂不是已经超出int能够表达的最大正整数,导致结果爆掉
其实整数在内存中是通过二进制补码的方式进行表示的(关于数字的的原码,反码,补码问题可以参考相关书籍,老毕的视频中也有讲到,不会的可以再问我)
二进制补码中正数是0打头的,负数是1打头的
这个int型16进制数0xFFFFFFE的在内存中的表示为
0000-1111-1111-1111-1111-1111-1111-1110
第一次左移变成:
0001-1111-1111-1111-1111-1111-1111-1100
第二次左移变成:
0011-1111-1111-1111-1111-1111-1111-1000
第三次左移变成:
0111-1111-1111-1111-1111-1111-1111-0000
第四次左移变成:
1111-1111-1111-1111-1111-1111-1110-0000
注意最后的那个是1打头的,是一个负数,就是-32啦补码啦,表示成十进制当然就是-32啦
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2