A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

1.整数所占字节数与能表示的十进制取值范围的对应关系(整数在内存中都是以二进制形式存储)
    1)sizeof(int)=4,即int型数据占在内存中占32位
    2)由于 int是signed int,所以32位中第一位用来表示符号,用来表示数值的位数只有31位
    3)忽略符号位,31位能表示的最大数应为:2^0+2^1+.....+2^30=2^31-1
        演示为何2^0+2^1+.....+2^30==2^31-1细节---由于32位过多,在此用8位展示与32位同理
        2^0+2^1+...+2^6 --------------------------------> 01111111
        2^7--->10000000         2^7-1--->10000000-1------->01111111         
    4)加上符号位表示正负,即int能表示的整数取值范围为:-2^31-1 ~ -0 && 0 ~  2^31-1
      疑问:为什么会有负零?
          加上符号位的8位所能表示的数值范围为:
          11111111 ~ 10000000 && 00000000 ~ 011111111
          其中10000000即为负零.(32位同理)
    5)又因为整数在内存中是以二进制的补码形式存储的,正负零都可以表示零,
        正数的原码反码补码都一样,编码稳定.所以就用负零表示数值 -2^31,
        因此int能表示的整数取值范围就变成了:-2^31~2^31-1


  2. 负零表示数值 -2^31的由来及计算机为什么要采用二进制补码的形式存储数据?
        现在 假设 整型占 2个字节即16位
        此时0有两种表现方法,即正0和负0:0000000000000000=1000000000000000=0
所以,二进制原码表现时,范围是-32767~-0和0~32767.
原码的正0和负0:0000000000000000和1000000000000000,补码表现中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样酿成了0000000000000000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表现2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时酿成1000000000000000。所以,人为规定1000000000000000这个补码编码为-32768。
计算机中采取二进制补码存储数据,即正数编码稳定,从0000000000000000到0111111111111111依旧表现0到32767,而负数需要把除符号位当前的部分取反加1,即-32767的补码为1000000000000001。正因为如此,所以补码的表示范围比原码和反码表示的范围都要大,计算机中才会采取用二进制补码存储整型数据.

3 个回复

倒序浏览
写的挺多,分析的也挺到位啊。
回复 使用道具 举报
好流弊的样子
回复 使用道具 举报
我来围观学习了啊!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马