32位系统中的无符号短整数提升

时间:2015-10-14 04:12:49

标签: c integer-promotion

我有一个32位整数

如果我有像

这样的算术表达式
unsigned short current_time, last_time
if((current_time - last_time) > timeout)

我相信current_time和last_time都会在减法之前转换为signed int 32。 16位整数系统没有问题,但是由于整数提升,这个32位整数系统会有可能产生负值吗?

2 个答案:

答案 0 :(得分:1)

如果current_time大于或等于last_time,则不会有潜在的负值。

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

  

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

如果unsigned short小于intunsigned short类型的所有值都可以由int表示,因此转换为 - int的值current_timelast_time与未转换的unsigned short值相同,减法的结果将与您预期的相同。

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

如果current_timelast_timeunsigned int s且current_time小于last_time,则减法的结果为{{1} },因而不是消极的;它将是时间之间的差异,以unsigned int的最大值为模。

如果可能的话,你可能想要专门处理倒退的时间。

答案 1 :(得分:0)

根据现代C规则,无符号短裤将促进签名整数,差异将根据其原始值正确签名。