黑马程序员技术交流社区

标题: 为什么0xFFFFFFFF是-1呢? [打印本页]

作者: dzr19850306    时间: 2013-2-7 08:04
标题: 为什么0xFFFFFFFF是-1呢?
FFFFFFFF=1111 1111 1111 1111 1111 1111 1111 1111
最高位是符号位1,所以是负数。
而其他 31位都是1,转为十进制为2^32-1=4294967695。
这个数字应该是 -4294967695.

当int i=-1的时候。应该是1000 0000 0000 0000 0000 0000 0000 0001.


以十六进制表示的时候,难道直接显示的是补码,而不是原码???
作者: 洪建超    时间: 2013-2-7 09:19
因为int 为带符号类型,带符号类型最高为是符号位,又因为0xFFFFFFFF,也就是四个字节32 bits全是1, 符号位是1,所以这个数是负数。

内存中的数值为补码表示,所以0xFFFFFFFF是一个负数的补码。负数从补码求原码,最高符号位不变,保持 1, 其余各位求反,末尾加1,也就是 0xFFFFFFFF,二进制为:11111111 11111111 11111111 11111111

->  10000000 00000000 00000000 00000000
->  10000000 00000000 00000000 00000001

原码首位表示符号位,其余位表示绝对值大小
作者: pzfpang449    时间: 2013-2-7 09:45
内存里面都是使用补码形式保存的。

其中正数的补码和原码相同

负数补码等于源码-〉反码 + 1;

对于 i=0xffffffff

ffffffff转换为二进制为 1111 1111 1111 1111 1111 1111 1111 1111

i(补)=0x80000000+0x1=0x80000001

二进制为1000 0000 0000 0000 0000 0000 0000 0001

为-1


另外如果使用%u 输出,这样作为无符号数字,因为最高为也用来表示数字本身,所以按照会你理解的数字大小表示。


说白了:-1的补码就是0xff。。。。。。

希望对楼主有所帮助
作者: 铿锵科技    时间: 2013-2-7 11:59
在计算机原理中,整数中的正数最高位为0,负数最高位为1,负数是正数按位取反后加1,所以
0xFFFFFFFF是-1




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2