我有一个32位整数
如果我有像
这样的算术表达式unsigned short current_time, last_time
if((current_time - last_time) > timeout)
我相信current_time和last_time都会在减法之前转换为signed int 32。 16位整数系统没有问题,但是由于整数提升,这个32位整数系统会有可能产生负值吗?
答案 0 :(得分:1)
如果current_time
大于或等于last_time
,则不会有潜在的负值。
引用第6.2.1.2节"有符号和无符号整数" C90规范:
当具有整数类型的值转换为另一个整数类型时,如果该值可以由新类型表示,则其值不变。
如果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
,则减法的结果为{{1} },因而不是消极的;它将是时间之间的差异,以unsigned int
的最大值为模。
如果可能的话,你可能想要专门处理倒退的时间。
答案 1 :(得分:0)
根据现代C规则,无符号短裤将促进签名整数,差异将根据其原始值正确签名。