我想确保我理解以下代码中发生的情况:
#include <stdio.h>
#include <stdint.h>
int main (void)
{
uint8_t a = 255;
a = a + 5;
printf("%d\n", a);
}
打印的值会是 4 吗?因为当 a 达到最大值时,它可以计数到 (255),它会重置回 0?那么,如果我想在 (255) 之后继续计数,我可以创建一个 int 变量并向其添加 a 吗?就像
int b = a + 5;
会打印 260。
非常正确。您只需要意识到,在表达式
a + 5
中,unsigned char
隐式提升为 5
的类型,即 int
,这要归功于称为“通常算术转换”的提升规则。因此,加法实际上是在 int
类型上进行的,最终会在临时 int
中得到 260。因此,您确实可以执行 int b = a + 5;
并得到 260,因为 a + 5
部分是 260。
在对
a
中的 a = a + 5
进行赋值期间,您强制另一次转换回 unsigned char
,并且该转换是“如同通过模数”比它可以容纳的最大数多 1 完成的。 260 % 256 = 4 所以你最终得到 4
。这与 unsigned char
环绕 时发生的情况完全相同。
(有符号整数上溢/下溢,这是未定义的行为。无符号整数环绕,这是明确定义的行为。)