【发布时间】:2012-04-20 08:03:03
【问题描述】:
我正在尝试减去两个无符号整数并将结果与有符号整数(或文字)进行比较。使用 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 并且与 unsigned int 进行比较,则减法结果将转换为无符号整数)。
【问题讨论】:
-
结果不仅仅是“存储在一个 int 中”。整个减法执行为
int减法,即两个uint16_t操作数在减法甚至有机会之前都转换为int开始吧。阅读积分促销活动。