为什么32位机int取值范围是-2^31~2^31-1?为什么不是-2^31-1~2^31-1?假设是3位机.最大值为011(+3)最小值为111(-3).正数和负数取值范围一样啊.怎么上面不一样? 数学
网友回答
【答案】 刚才已经给你回答了这个问题,但是貌似你没明白.
3位机的话总长度是2^3,对有符号数来说各占一半,也就是2^2=4,也就是三位机的int范围为(-4~+4),但是0被划到了正数的范畴,所以三位机中int的范围应该是(-4~+3),对于你说的011是表示+3没问题,但是计算机中负数是用补码表示的,并不是像你说的111的最高位是1表示负号,然后后面的11表示3结果就是-3.那这样的话32位机上的int范围也不对了.
计算补码应该遵循这样的原则,正数的原码,反码和补码都一样,
负数的补码计算方式为:先对原码-4取绝对值,也就是4即二进制形式的100,再对这个绝对值取反(即每一位由1变0,由0变1)因此上面的100就变成了011,然后对反码进行加1操作,就得到了补码100,也就是-4的补码是11100,也就是说100表示的是-4,而不是-3 追问: 刚才采纳了你后才发现自己没弄懂。 追答: 嗯是的,你可以简单是这样看,对于3位机来说最大值应该是111,这个111再+1就变成了1000了,三位机保留最护三位就变成了0了,因此谁加1会是0呢,自然是-1了。 或者可以自己计算一下 111最高位是1,因此111表示的是负数,那么就要把他还原为原码,还原的过程和计算补码的过程正好相反,先-1,然后取反,然后加个符号 111-1=110,取反,得到001,表示1然后加个符号,得到-1 追问: -4的反码为100我懂了,但如何算出反码100=-4呢? 追答: 因为要计算的是有符号数,因此最高位是1表示他是负数,不能直接用1*2^2+0*2^1+0*2,这种方式写出,既然你会由-4求100的过程(-4取绝对值变成4,得到二进制形式100,然后取反得到011,然后加1,得到补码100),补码100到-4的过程正好是这个过程的逆过程,100减1得到011,011取反,得到100,100表示4,加个负号就得到-4了。