0

我有一个 32 位整数大小

如果我有一个算术表达式

unsigned short current_time, last_time
if((current_time - last_time) > timeout)

我相信 current_time 和 last_time 在减法之前都会被转换为signed int 32。16 位整数大小系统没有问题,但是对于这个 32 位整数大小系统,是否会因为整数提升而产生负值?

4

2 回答 2

1

如果current_time大于或等于last_time,则不会出现负值。

引用 C90 规范的第 6.2.1.2 节“有符号和无符号整数”:

当一个整数类型的值转换为另一个整数类型时,如果该值可以用新类型表示,则其值不变。

由于unsigned short比 短int,所有类型的值都unsigned short可以用 表示int,因此 和 的转换为int值将current_time与其last_time未转换的unsigned short值相同,并且减法的结果将是您期望的结果。

但是,如果current_time小于 last_time则可能出现负值;然而,这不是一个错误,而是一个特性,因为在这种情况下,时间确实倒退了。

如果current_timelast_timeunsigned ints,并且current_time小于last_time,则减法的结果将是unsigned int,因此不是负数;这将是时间之间的差异,以 a 的最大值为模unsigned int

无论如何,如果可能发生,您可能希望特别处理时间倒退。

于 2015-10-14T04:24:08.447 回答
0

根据现代 C 规则,无符号短裤将提升为有符号整数,并且差异将根据其原始值正确签名。

于 2015-10-14T04:19:17.467 回答