总结
- 无符号整数上溢出:结果从最大值绕回到最小值,数值变小。
- 无符号整数下溢出:不存在,因为最小值是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位有符号整数
具体比较
-
表示范围:
- 无符号整数:只表示非负整数,范围更广。
- 有符号整数:表示负数和正数,范围较窄。
-
用途:
- 无符号整数:适用于只需要表示非负数的情况,如计数、内存地址等。
- 有符号整数:适用于需要表示负数的情况,如温度、金融计算等。
-
存储方式:
- 无符号整数:直接按位存储,所有位都表示数值。
- 有符号整数:最高位作为符号位,其余位表示数值(通常采用二进制补码形式)。
示例
-
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
)
- 最大值:255 (
变小:无符号整数上溢出后,结果会从最大值变为最小值,数值显著变小。
下溢出(Underflow)
无符号整数不存在下溢出,因为它们不表示负数,最小值为0。
有符号整数
有符号整数(Signed Integer)可以表示正数、负数和零,采用补码(Two’s Complement)表示。
上溢出(Overflow)
当有符号整数的运算结果超过它的最大正值时,结果会变为一个负数。
- 示例(8位有符号整数):
- 最大值:127 (
01111111
) - 运算:127 + 1
- 二进制结果:
10000000
(补码表示的-128)
- 最大值:127 (
变小:有符号整数上溢出后,结果会变成一个大的负数,数值显著变小。
下溢出(Underflow)
当有符号整数的运算结果低于它的最小负值时,结果会变为一个正数。
- 示例(8位有符号整数):
- 最小值:-128 (
10000000
) - 运算:-128 - 1
- 二进制结果:
01111111
(补码表示的127)
- 最小值:-128 (
变大:有符号整数下溢出后,结果会变成一个大的正数,数值显著变大。
例子
cost = body.quantity * 10;
if cost != 0 {
GONGDE.set(GONGDE.get() - cost as i32);
}
32位有符号整数:-2147483648 到 2147483647
我们要使得cost成为大负数
有符号整数上溢出:结果从最大正值变为负数,数值变小。