我环顾四周,似乎无法找到这个看似简单的问题的答案:C(位)究竟是“+”还是“ - ”?
例如,将1添加到11111111 11111111 11111111 11111111时的表示是什么?
我问这个是因为我正在阅读一些代码并且我不知道是什么
~0 + 1
正在做。我的意思是,我们不能将1添加到4294967295吗?
谢谢!
答案 0 :(得分:4)
答案取决于您的计算机用于签名号码的表示形式。
以“二人补语”格式~0 == -1
,~0 + 1 == 0
。
以“Ones'Complement”格式~0 == -0
,~0 + 1 == 1
。
采用“符号幅度”格式,~0 == INT_MIN
,~0 + 1 == INT_MIN + 1
。
保证在所有系统上定义结果。
另一方面,如果您使用无符号数字,您将始终获得相同的结果。
~n
被定义为n
类型的最大值,减去n
。因此~0u
为UINT_MAX
。
x + y
保证包装,因此标准保证所有系统都UINT_MAX + 1 == 0
。
因此,所有系统都~0u + 1 == 0u
,保证。
正如您所看到的,这与两个补码的行为相同,这解释了两个补码的流行度。如今,不使用二进制补码的系统很少见,不包括bigint库。
答案 1 :(得分:3)
当然可以。由于您没有指定任何文字的类型,因此假定为'int'。如您所示,~0
为-1
,-1 + 1
为零。
如果另一方面这些是无符号数,那么你有一个整数溢出。 PC内部的实际添加指令仍然返回零,它只是设置一个'进位'标志,让C知道发生了奇怪的事情。在C规范中,整数溢出的结果是未定义的,所以你/可能/得到零,但你不能依赖它。
答案 2 :(得分:1)
让我们坚持使用较小的数字,以便更容易看到正在发生的事情。
4位数字为0000
。从1111
开始,现在添加一个。该值现在为1 0000
,您将看到0000
。
就像普通基地十加一样。我们9
然后我们在某个地方0
和1
在十位。如果我们的数字大于我们的位数,那么计数器只会翻到0并重新开始。
现在,这简化为谈论正数。如果int是有符号的,则从最大正数到最大负数并循环回到最大正数,最终对负数和正数以二进制形式存储的方式。
答案 3 :(得分:0)
2^32=4294967296
因此,2^32-1
是32位无符号整数(32位二进制数字)的最大值。 2 ^ 32是可能值的数量
4294967295是因为整数从0开始,但我们的计数从1开始
这是一个整数范围,当你向这个数字加1时,它超出整数范围,这就是为什么我们不能将一个添加到4294967295.
+
是一个加法算术运算符& -
是减法算术运算符
答案 4 :(得分:0)