小池的呆妞
2015-01-18 12:32
然后那个取值范围是怎么计算的呢?
恩,现在流行的编译器,都是规定的int是四个字节~像tc这样老版的编译器,int才是两个字节,然后也是一样,由于一个字节占八位,最高为符号位,又人为规定,1000000000000000......这个补码编码为-2^31所以,范围就是-2^31~2^31-1
——关于int(4字节)的取值范围由来(-2^31~2^31-1)?
1.【32位】一个字节占8位,所以4字节总共是占32位,然后去掉第一位,也即符号位(1:负,0:正),也就剩下31位!
2.【最大值:2^31-1】为什么不是2^31?
(1)假设只有三位,其中首位为符号位的话,最大值的情况不就是011吗?也即表示3.
3 = 2^(3-1)-1.
(2)32位的时候同理,01111111 11111111 11111111 11111111 //而这个数表示的值就是2^31-1.
2^31-1 = 2^(32-1)-1.
3.【最小值:-2^31】为什么不是-(2^31-1)?
(1)因为数据是由二进制补码存储的:
1)当原码为正数的时候,正数的原码反码补码都相同,即00011的反码也为00011,补码也为00011.
2)当原码为负数的时候,反码即按位取反,比如10011为原码,10011可表示-3,那么符号位不变,其余位按位取反即反码11100.那么10011的补码便是11101.
(2)所以可知int所取的最小值原码为:11111111 11111111 11111111 11111111.
它的反码为:10000000 00000000 00000000 00000000. (在原码中表示-0.)
它的补码为:10000000 00000000 00000000 00000001. (在原码中表示-1.)
依次可以类推-2,-3,-4......-2^31!
【推到-2^31】
其原码为10000000 00000000 00000000 00000001
其反码为11111111 11111111 11111111 11111110
其补码为11111111 11111111 11111111 11111111
从上可知最小值只能表示到-2^31,而无法表示到更小的一位:-2^31-1!
4.【综上所诉,int(4字节)范围是:-2^31~2^31-1】!
(自己对于这个问题也纠结了很久,得出的结论若有不足之处,敬请批评指正,谢谢!)
计算机是按二进制方式存储数据的,在计算机中表示整型数据有以下几种方法:
1.二进制补码:二进制补码在计算机中比较常用,当表示负数的时候,在原来原码的基础上再加1
2.二进制反码:二进制反码是简单地把正数取反就是对应的负数了,比如00000001为1,11111110为-1
3.偏移表示法: 偏移表示法用一个数与它相减就得到所需的数
4.带符号的数表示法:最高有效位是符号位,1为负,0为正。比如:00000001为1,10000001为-1
注:正数的原码反码补码都相同,即0011的反码也为0011
举例来说:对于正数3,其二进制形式为 0011,我们把 0011称为真值,在计算机中用0或1表示正负号,那么 0011在计算机中原码可以表示为00011(第一位为符号位)。反码补码不变。
对于负数,反码即按位取反,比如10011可表示-3,10011为原码,那么符号位不变,其余位按位取反即反码11100. 补码的存在是为了简化计算的,其符号位一起参加运算,从而对于减法可转化为加法。补码的实质就是mod2。比如我们的钟表是mod12的,那么14点钟我们也可以说是下午2点。获得补码的方法是“按位取反,末位加1”那么10011的补码便是11101.。。。。。。。。。。
机器数即数值在计算机中的表示形式。
(注:以上是本人查找整理的有关原码、反码和补码的知识,恶补一下自己的储量!若有不足之处,请大大们批评指正,感谢!)
这个问题,很赞的说,路过学习!
不是,占2个字节
学习了
2个字节 1字节 = 8bit so。。。。
C语言入门
926024 学习 · 20793 问题
相似问题