Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 添加两个有符号或无符号整数_C++_C_Integer_Twos Complement - Fatal编程技术网

C++ 添加两个有符号或无符号整数

C++ 添加两个有符号或无符号整数,c++,c,integer,twos-complement,C++,C,Integer,Twos Complement,自从我上次在位和字节级别编程以来已经有很长时间了,我想确认一些我似乎记得的事情: 假设我有两个长度相等的整数(1,2,4,8字节;没关系),我把它们相加:如果它们是有符号的还是无符号的,求和的逐位结果是否不同。换句话说:不管它们是有符号整数还是无符号整数,位最终会是相同的吗 我的直觉和我脆弱的记忆告诉我他们会的,但我只是想确认一下。谢谢。假设实现使用2的补码作为有符号整数的表示,那么结果将是相同的。在其他表述中,它们不会 编辑 正如在评论中指出的,签名加法中的溢出是未定义的行为,这意味着在这种情

自从我上次在位和字节级别编程以来已经有很长时间了,我想确认一些我似乎记得的事情:

假设我有两个长度相等的整数(1,2,4,8字节;没关系),我把它们相加:如果它们是有符号的还是无符号的,求和的逐位结果是否不同。换句话说:不管它们是有符号整数还是无符号整数,位最终会是相同的吗


我的直觉和我脆弱的记忆告诉我他们会的,但我只是想确认一下。谢谢。

假设实现使用2的补码作为有符号整数的表示,那么结果将是相同的。在其他表述中,它们不会

编辑


正如在评论中指出的,签名加法中的溢出是未定义的行为,这意味着在这种情况下无法对结果进行任何说明。

我知道这一点已经得到了回答,但我使用过的所有处理器(大约有十几种不同的体系结构-我指的是体系结构,而不是不同的风格)只有一种类型的ADD指令-它可能有不同的大小选项,但它是唯一的指令。这同样适用于减法。乘法和除法是不同的,通常有符号和无符号的变体,或者要求输入以某种方式进行“符号调整”


区分有符号和无符号的唯一其他指令是条件指令,例如,“小于上的分支”将有一个变量表示“无符号小于”,一个变量表示“有符号小于”(其中一个通常称为“小于”以外的其他指令,如“低于”或“进位集”或类似的指令)

IIRC,虽然结果看起来不错,但C/C++标准表示整数溢出会导致未定义的行为。编辑:无符号算术不会溢出,并且通常按照换行符进行操作。@nhahtdh:谢谢;没关系。我用C++来标记它,因为我认为这是一个好的听众,但我会用另一种语言来使用它。我希望我能投票给你两次:一次是为了回答,另一次是为了确认我的记忆不是那么糟糕:-爱德华多,我将投第二次票。好的,简短的,正确的回答。当在加法中调用UB时,它们也不会。这是一个非常好的观点-即使标准说行为是未定义的,它也不可能做底层CPU架构没有做的事情。这不是C和C++滚动。@ MalkSunm它实际上取决于上下文。上面由NHAHDH链接的问题显示了一个编译器介入的示例。是的。当然,可能有一些CPU的“加法”和“减法”指令有不同的有符号和无符号,我还没有看到(甚至听说过)。C/C++规范是由语言律师编写的,他们必须满足各种奇怪的硬件要求。这并不意味着我们会经常看到这种类型的硬件…;)MIPS有两条(事实上是四条,因为add immediate)add指令:一条陷阱指令和一条不陷阱指令。这是有符号或无符号值溢出时的陷阱指令吗?