分配给较大宽度的整数时的 C 整数溢出行为

标签 c casting integer overflow integer-overflow

如果我在 C 中执行以下代码:

#include <stdint.h>

uint16_t a = 4000;
uint16_t b = 8000;

int32_t c = a - b;

printf("%d", c);

它正确地打印出“-4000”作为结果。不过,我有点疑惑:用一个更大的无符号整数减去另一个,不应该算术溢出吗?这里有什么选角规则在起作用?这个问题似乎有点菜鸟,所以任何引用将不胜感激。

最佳答案

这个问题其实有点复杂。算术表达式的操作数使用您可以在 Standard (C89) 的第 3.2.1.5 节中看到的特定规则进行转换。 .在您的情况下,答案取决于类型 uint16_t 是什么。如果它小于 int,例如 short int,那么操作数将转换为 int,您将得到 -4000,但在 16-位系统,uint16_t 可以是 unsigned int 并且不会自动转换为有符号类型。

关于分配给较大宽度的整数时的 C 整数溢出行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/728847/

相关文章:

c++ - vtd-xml c++编译安装报错

java - 如何从 JNA 调用 ALSA 分配#define?

c# - 为什么我必须转换为类型参数而不能使用受约束的类型?

Java 将字符串转换为整数进行比较

c++ - C/C++ - 将 24 位有符号整数转换为 float

c - 使用 malloc 初始化一个 char 指针数组

c - 是否可以将字符串转换为 int 来转换值?

swift - 检查继承类和 super 类

sql - SQL中的整数到位

c 语法帮助 - 非常基础