C: gcc 中的 uint16_t 减法行为

标签 c gcc unsigned stdint

我正在尝试减去两个无符号整数并将结果与​​有符号整数(或文字)进行比较。使用 unsigned int 类型时,行为符合预期。使用 uint16_t(来自 stdint.h)类型时,行为不是我所期望的。比较是使用 gcc 4.5 完成的。
给定以下代码:

unsigned int a;
unsigned int b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);

输出为 0,这是我所期望的。 a 和 b 都是无符号的,b 大于 a,所以结果是一个大于 10 的大无符号数。现在如果我将 a 和 b 更改为类型 uint16_t:

uint16_t a;
uint16_t b;

a = 5;
b = 20;

printf("%u\n", (a-b) < 10);

输出是1,这是为什么呢?两个 uint16_t 类型相减的结果是否存储在 gcc 中的一个 int 中?如果我将 10 更改为 10U,则输出再次为 0,这似乎支持这一点(如果减法结果存储为 int 并且与无符号数进行比较int 比减法结果将转换为 unsigned int)。

最佳答案

因为不使用 int/unsigned int 以下的类型(char、short、unsigned short 等;但不包括 long、unsigned long 等)进行计算,但它们首先被提升为 int 或 unsigned int 之一。 “uint16_t”在您的实现中可能是“unsigned short”,在您的实现中被提升为“int”。所以计算的结果是“-15”,它小于 10。

在使用 16 位计算的旧实现中,“int”可能无法表示“unsigned short”的所有值,因为它们具有相同的位宽。这样的实现必须将“unsigned short”提升为“unsigned int”。在此类实现中,您的比较结果为“0”。

关于C: gcc 中的 uint16_t 减法行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10047956/

相关文章:

c++ - C++ 构造函数中的损坏

c - C 结构如何引用自身?

Java 7 未签名小程序权限 1.7.0_45

c - 将负 int 值存储在无符号位中并从中减去

c - 多线程和缓存非同时使用内存

c - C中用一个空格替换多个空格

gcc - 我应该优化多少?

关于 C 中无符号类型的说明

比较常量

ios - 64 位 iOS 设备中的 realloc()