呵呵!高分相赠!请大家别说我菜!

时间:2022-08-31 20:52:25

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啊.

#4


有什么问题呢?结果不是很正确吗?
应该就是14和-4啊。

#5


1.1111 1111 1111 1111 1111 1111 1111 0110

用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho

#6


有没有高手能将上面3个问题系统的讲一下呢?

#7


1.同上
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
 从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试

#8


3.你如果用
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了。

#1


第一种
内部表示那样.与输出无关

#2


Help!!!!

#3


有什么问题啊,结果不是很正确吗?
应该就是14和-4啊.

#4


有什么问题呢?结果不是很正确吗?
应该就是14和-4啊。

#5


1.1111 1111 1111 1111 1111 1111 1111 0110

用windows的计算器就知道了。呵呵,输入10进制的-10,然后转2进制。hoho

#6


有没有高手能将上面3个问题系统的讲一下呢?

#7


1.同上
2.补码正负数个数是一样的,0算到了正数,所以负数就多了一个范围
 从二进制来说:0x80000000表示的是-2^7,而0x00000000表示的是0,正数没有办法来表示+2^7
3.我试试

#8


3.你如果用
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了。