我有一个 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 ints,并且current_time小于last_time,则减法的结果将是unsigned int,因此不是负数;这将是时间之间的差异,以 a 的最大值为模unsigned int。
无论如何,如果可能发生,您可能希望特别处理时间倒退。
根据现代 C 规则,无符号短裤将提升为有符号整数,并且差异将根据其原始值正确签名。