是否定义了以下代码的行为?
int32_t i = -0x80000000;
uint32_t u = abs(i);
第一行可能存在溢出/下溢。但是在平台上没问题的情况下,第二行是否定义了行为?
答案 0 :(得分:3)
你的意思是-0x80000000
有七个0吗? abs(-0x8000000)
的行为肯定定义明确(uint32_t
和int32_t
在其有效范围中包含±0x8000000
,如果这些类型存在。
当标准说一个行为未定义时,即使某个特定平台以某种定义的方式工作,它也是未定义的。
C ++的abs
函数取自C,C标准表示(§7.20.6.1/ 2):
abs
,labs
和llabs
函数计算整数j
的绝对值。 如果 结果无法表示,行为未定义。 259)259)最负数的绝对值不能用二进制补码表示。
因此abs
的结果未定义。实际上它将返回0x80000000
,但这不是标准定义的行为。