1、请问十进制数-10的二进制表示是= 1111 1111 1111 1111 1111 1111 1111 0110
还是= 1000 0000 0000 0000 0000 0000 0000 0110
或是= 1111 1111 0000 0000 0000 0000 0000 0110
或其它?
2、byte (8 bits)的取值范围是:-2^7 ... 2^7 -1,请从二进制的基础讲为什么负数和正数的取值范围不一样?
3、我看了这么一段话“Java使用补码表示二进制,在补码表示中,最高位为符号,正数的符号位为0,负数为1。补码的规定如下:
对正数而言,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为0010 1010;
对负数而言,把该数绝对值按位取反,然后对整个数加1,及得该数补码。如-42得补码为1101 0110(0010 1010按位取反得1101 0101+0000 0001)。”
问题来了:
int i = 0xFFFFFFF1;
int j = ~i;
System.out.println(j);//结果为14。
int jj=i>>2;
System.out.println(jj);//-4
j的求值直接使用位取反而得,难道它不用转化为补码表示吗?jj的值为-4我就搞不懂了。
晕~!请高手讲解一下这些问题!谢谢!
10 个解决方案
#1
第一种
内部表示那样.与输出无关
内部表示那样.与输出无关
#2
Help!!!!
#3
有什么问题啊,结果不是很正确吗?
应该就是14和-4啊.
应该就是14和-4啊.
#4
有什么问题呢?结果不是很正确吗?
应该就是14和-4啊。
应该就是14和-4啊。
#5
1.1111 1111 1111 1111 1111 1111 1111 0110
用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho
用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho
#6
有没有高手能将上面3个问题系统的讲一下呢?
#7
1.同上
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试
#8
3.你如果用
System.out.println(i);
会发现显示的是:-15
说明你的int i = 0xFFFFFFF1; 表示的是-15
java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
System.out.println(i);
会发现显示的是:-15
说明你的int i = 0xFFFFFFF1; 表示的是-15
java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
#9
gz
#10
我上面这句话说错了:java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
应该是:程序中是用可以补码表示正数的。0xFFFFFFF1正是 -15的补码啊
int j = ~i; 表示把i按位取反。~符号是取反符号,就是把这个数的补码所有位取反:0x0000000E当然是14了
你如果 用int jjj = -i就会显示15了。
并不是说要你在程序中用补码表示整数
应该是:程序中是用可以补码表示正数的。0xFFFFFFF1正是 -15的补码啊
int j = ~i; 表示把i按位取反。~符号是取反符号,就是把这个数的补码所有位取反:0x0000000E当然是14了
你如果 用int jjj = -i就会显示15了。
#1
第一种
内部表示那样.与输出无关
内部表示那样.与输出无关
#2
Help!!!!
#3
有什么问题啊,结果不是很正确吗?
应该就是14和-4啊.
应该就是14和-4啊.
#4
有什么问题呢?结果不是很正确吗?
应该就是14和-4啊。
应该就是14和-4啊。
#5
1.1111 1111 1111 1111 1111 1111 1111 0110
用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho
用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho
#6
有没有高手能将上面3个问题系统的讲一下呢?
#7
1.同上
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试
#8
3.你如果用
System.out.println(i);
会发现显示的是:-15
说明你的int i = 0xFFFFFFF1; 表示的是-15
java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
System.out.println(i);
会发现显示的是:-15
说明你的int i = 0xFFFFFFF1; 表示的是-15
java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
#9
gz
#10
我上面这句话说错了:java在编译器内部是用补码表示的
并不是说要你在程序中用补码表示整数
应该是:程序中是用可以补码表示正数的。0xFFFFFFF1正是 -15的补码啊
int j = ~i; 表示把i按位取反。~符号是取反符号,就是把这个数的补码所有位取反:0x0000000E当然是14了
你如果 用int jjj = -i就会显示15了。
并不是说要你在程序中用补码表示整数
应该是:程序中是用可以补码表示正数的。0xFFFFFFF1正是 -15的补码啊
int j = ~i; 表示把i按位取反。~符号是取反符号,就是把这个数的补码所有位取反:0x0000000E当然是14了
你如果 用int jjj = -i就会显示15了。