C++ abs溢出是否定义良好?

C++ abs溢出是否定义良好?,c++,C++,以下代码的行为是否定义良好 int32_t i = -0x80000000; uint32_t u = abs(i); 第一行可能有溢流/下溢。但是在平台上,如果可以的话,第二行是否定义了行为?您的意思是-0x8000000和七个0?abs(-0x8000000)的行为肯定是明确定义的(如果存在这些类型,则uint32\u t和int32\u t都包含±0x8000000) 当标准说某个行为未定义时,即使某些特定平台以某种定义的方式工作,它也未定义 C++的abs函数取自C,C标准规定(§7

以下代码的行为是否定义良好

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

第一行可能有溢流/下溢。但是在平台上,如果可以的话,第二行是否定义了行为?

您的意思是
-0x8000000
和七个0?
abs(-0x8000000)
的行为肯定是明确定义的(如果存在这些类型,则
uint32\u t
int32\u t
都包含
±0x8000000


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

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

如果 无法表示结果,行为未定义。259)

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


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

No,这将是“未指定的”。未指定的行为是指标准规定“无论您的平台如何做”;无符号整数溢出就是一个例子。未定义行为是指标准要求实现没有特定行为;不同的应用程序运行、不同的编译、不同的机器的行为可能不同,并且没有系统模式。是的,我是说70。谢谢标准的引用。@BillyONeal:实际上我只想说,代码在某些平台上工作≠ 这是定义的行为。@Billy ONeal:这不是未定义的行为或未指定的行为的意思。未定义的行为意味着标准对实现的行为没有要求。未指定的行为意味着实现必须符合一系列或一组允许的行为,但不必记录它遵循的行为。未定义的行为是“本国际标准未规定要求的行为”。实现的任何响应都是完全正确的。2的补码实现将最负数作为最负数的绝对值返回,这没有什么错。让应用程序发出嘎嘎声也没什么错。