什么是整数溢出?

总结

  • 无符号整数上溢出:结果从最大值绕回到最小值,数值变小。
  • 无符号整数下溢出:不存在,因为最小值是0。
  • 有符号整数上溢出:结果从最大正值变为负数,数值变小。
  • 有符号整数下溢出:结果从最小负值变为正数,数值变大。

什么是无符号整数,什么是有符号整数?

无符号整数和有符号整数是两种不同的整数表示方法,它们在计算机科学中有不同的用途和表示范围。

无符号整数(Unsigned Integer)

无符号整数仅能表示非负整数,即从零开始到一个最大正整数。由于它不需要考虑负数,因此它能表示的正整数范围更大。

  • 表示范围

    • 8位无符号整数:0 到 255
    • 16位无符号整数:0 到 65535
    • 32位无符号整数:0 到 4294967295
  • 示例

    unsigned int a = 4294967295;  // 最大32位无符号整数
    unsigned int b = 0;           // 最小32位无符号整数
    

有符号整数(Signed Integer)

有符号整数可以表示正数、零和负数。它使用最高位(最左边的位)作为符号位来表示整数的正负。通常情况下,0表示正,1表示负。由于一部分位被用作符号位,因此它能表示的正整数范围较小。

  • 表示范围

    • 8位有符号整数:-128 到 127
    • 16位有符号整数:-32768 到 32767
    • 32位有符号整数:-2147483648 到 2147483647
  • 示例

    int a = 2147483647;  // 最大32位有符号整数
    int b = -2147483648; // 最小32位有符号整数
    

具体比较

  1. 表示范围

    • 无符号整数:只表示非负整数,范围更广。
    • 有符号整数:表示负数和正数,范围较窄。
  2. 用途

    • 无符号整数:适用于只需要表示非负数的情况,如计数、内存地址等。
    • 有符号整数:适用于需要表示负数的情况,如温度、金融计算等。
  3. 存储方式

    • 无符号整数:直接按位存储,所有位都表示数值。
    • 有符号整数:最高位作为符号位,其余位表示数值(通常采用二进制补码形式)。
示例
  • 8位无符号整数:

    • 00000000 表示 0
    • 11111111 表示 255
  • 8位有符号整数(补码):

    • 00000000 表示 0
    • 01111111 表示 127
    • 11111111 表示 -1
    • 10000000 表示 -128
      #溢出

无符号整数

无符号整数(Unsigned Integer)只能表示非负数,从0到最大值。

上溢出(Overflow)

当无符号整数的运算结果超过它的最大值时,结果会绕回到最小值。

  • 示例(8位无符号整数):
    • 最大值:255 (11111111)
    • 运算:255 + 1
    • 二进制结果:100000000(超过8位)
    • 结果:0 (00000000)

变小:无符号整数上溢出后,结果会从最大值变为最小值,数值显著变小。

下溢出(Underflow)

无符号整数不存在下溢出,因为它们不表示负数,最小值为0。

有符号整数

有符号整数(Signed Integer)可以表示正数、负数和零,采用补码(Two’s Complement)表示。

上溢出(Overflow)

当有符号整数的运算结果超过它的最大正值时,结果会变为一个负数。

  • 示例(8位有符号整数):
    • 最大值:127 (01111111)
    • 运算:127 + 1
    • 二进制结果:10000000(补码表示的-128)

变小:有符号整数上溢出后,结果会变成一个大的负数,数值显著变小。

下溢出(Underflow)

当有符号整数的运算结果低于它的最小负值时,结果会变为一个正数。

  • 示例(8位有符号整数):
    • 最小值:-128 (10000000)
    • 运算:-128 - 1
    • 二进制结果:01111111(补码表示的127)

变大:有符号整数下溢出后,结果会变成一个大的正数,数值显著变大。

例子

cost = body.quantity * 10;  
if cost != 0 {  
    GONGDE.set(GONGDE.get() - cost as i32);  
}

32位有符号整数:-2147483648 到 2147483647
我们要使得cost成为大负数
有符号整数上溢出:结果从最大正值变为负数,数值变小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值