关于C中uint8_t计数时的使用

问题描述 投票:0回答:1

我想确保我理解以下代码中发生的情况:

#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。

c integer printf byte uint8t
1个回答
0
投票

非常正确。您只需要意识到,在表达式

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
环绕 时发生的情况完全相同。

(有符号整数上溢/下溢,这是未定义的行为。无符号整数环绕,这是明确定义的行为。)

© www.soinside.com 2019 - 2024. All rights reserved.