abs的溢出是否定义明确?

时间:2011-11-19 19:22:55

标签: c++

是否定义了以下代码的行为?

int32_t i = -0x80000000;
uint32_t u = abs(i);

第一行可能存在溢出/下溢。但是在平台上没问题的情况下,第二行是否定义了行为?

1 个答案:

答案 0 :(得分:3)

你的意思是-0x80000000有七个0吗? abs(-0x8000000)的行为肯定定义明确(uint32_tint32_t在其有效范围中包含±0x8000000,如果这些类型存在


当标准说一个行为未定义时,即使某个特定平台以某种定义的方式工作,它也是未定义的。

C ++的abs函数取自C,C标准表示(§7.20.6.1/ 2):

  

abslabsllabs函数计算整数j的绝对值。 如果   结果无法表示,行为未定义。 259)

     

259)最负数的绝对值不能用二进制补码表示。   

因此abs的结果未定义。实际上它将返回0x80000000,但这不是标准定义的行为。