自从我上次在位和字节级别编程以来已经有很长时间了,我想确认一下我似乎记得的那些日子:
假设我有两个长度相等的整数(1、2、4、8 字节;没关系),我将它们相加:如果它们是有符号或无符号的,求和的逐位结果是否不同。换句话说:无论它们是有符号整数还是无符号整数,这些位最终会相同吗?
我的直觉和脆弱的记忆告诉我他们会的,但我只是想确认一下。谢谢。
自从我上次在位和字节级别编程以来已经有很长时间了,我想确认一下我似乎记得的那些日子:
假设我有两个长度相等的整数(1、2、4、8 字节;没关系),我将它们相加:如果它们是有符号或无符号的,求和的逐位结果是否不同。换句话说:无论它们是有符号整数还是无符号整数,这些位最终会相同吗?
我的直觉和脆弱的记忆告诉我他们会的,但我只是想确认一下。谢谢。
假设实现使用 2 的补码作为有符号整数的表示,那么结果将是相同的。在其他表示中,他们不会。
编辑
正如评论中所指出的,有符号加法中的溢出是未定义的行为,这意味着在这种情况下对结果无话可说。
我知道这已经得到解答,但是我曾经使用过的所有处理器(大约有十几种不同的架构——我的意思是架构,而不是不同的风格)只有一种类型的 ADD 指令——它可能有不同的大小选项,但是这是一条指令。这同样适用于减法。它在乘法和除法上有所不同,它通常具有有符号和无符号的变体——或者需要以某种方式对输入进行“符号调整”。
区分有符号和无符号的唯一其他指令是条件指令,例如“小于分支”将具有“无符号小于”的一种变体和“有符号小于”的一种变体(其中一个通常称为“小于”以外的其他内容,例如“低于”或“进位设置”等)。