我有一个 32 位整数大小
如果我有一个算术表达式
unsigned short current_time, last_time
if((current_time - last_time) > timeout)
我相信 current_time 和 last_time 在减法之前都会被转换为signed int 32。16 位整数大小系统没有问题,但是对于这个 32 位整数大小系统,是否会因为整数提升而产生负值?
我有一个 32 位整数大小
如果我有一个算术表达式
unsigned short current_time, last_time
if((current_time - last_time) > timeout)
我相信 current_time 和 last_time 在减法之前都会被转换为signed int 32。16 位整数大小系统没有问题,但是对于这个 32 位整数大小系统,是否会因为整数提升而产生负值?
如果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_time
和last_time
是unsigned int
s,并且current_time
小于last_time
,则减法的结果将是unsigned int
,因此不是负数;这将是时间之间的差异,以 a 的最大值为模unsigned int
。
无论如何,如果可能发生,您可能希望特别处理时间倒退。
根据现代 C 规则,无符号短裤将提升为有符号整数,并且差异将根据其原始值正确签名。