Dove_Pony 2021-10-30 10:54 采纳率: 100%
浏览 58
已结题

整型最大值为什么比2147483648少1

① 已知在内存中,整型数据占 4 个字节空间,最大值为 2147483647,程序中变量 b 的值为什么不是 2147483648?将一个大于 2147483647 的整数赋给一个整型变量,会得到什么结果?
② 占内存 4 个字节的整数的最小值为什么是-2147483648 而不是-2147483647?程序中变量 d 的值为什么不是-2147483649

  • 写回答

1条回答 默认 最新

  • 秋山刀名鱼丶 2021-10-30 11:14
    关注

    C++中,int占用4字节,32比特,数据范围为-2147483648~2147483647 。

    int占用2字节,16比特,数据范围为-32768~32767。

    详细解答过程,以两个字节为例:

    在C中,int型数据是一个有符号的整型数据,其最高位为符号位(0表示正,1表示负)。

    1个字节等价于8个二进制位,在很多计算机系统中,通常采用补码来表示带符号的数(补码系统)。

    原码:最高位为符号位(0表示正,1表示负),其他位按照一般的方法来表示数的绝对值。

    反码:对于一个带符号的书来说,正数的反码与其原码相同,负数的反码为其原码除符号位以外的各位按位取反。

    补码:正数的补码与其原码相同,负数的补码为其反码在最低位加1。

    两个字节,所以,二进制原码最大为0111 1111 1111 1111 = 2^15 - 1 = 32767。

    最小为1111 1111 1111 1111 = - (2^15 - 1) = -32767。

    原码中0的表示有正负之分[+0]原 = 0000 0000 0000 0000;[-0]原 =1000 0000 0000 0000。

    所以二进制原码表示时,范围是 -32767 ~ -0和0~32767,因为有两个0,所以不同的数值个数一共有2^16 - 1个。

    而计算机采用而进驻补码存储数据时,0的表示是唯一的:[+0] 补= [-0] 补= 0000 0000 0000 0000

    此时正数编码不变,从0000 0000 0000 0000 ~ 0111 1111 1111 1111依然表示0 ~ 32767。

    负数表示需依照补码规则,即-32767的补码为1000 0000 0000 0001。

    所以补码中会比原码多一个编码出来,这个编码就是1000 0000 0000 0000,因为任何一个原码都不可能在转化成补码时变成1000 0000 0000 0000,所以人们规定1000 0000 0000 0000这个补码编码为-32768。

    结论:int型数据占两个字节时,可表示2^16种变化,最高位为符号位,所以正负有2^15中变化,因为0也占一种,因此正负数的最大值并不对称,即该int型数据取值范围为-32768 ~ 32767。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)
  • ¥15 AIC3204的示例代码有吗,想用AIC3204测量血氧,找不到相关的代码。