简单:什么是“+”运算符(C位)?

时间:2012-10-13 04:20:01

标签: c bits

我环顾四周,似乎无法找到这个看似简单的问题的答案:C(位)究竟是“+”还是“ - ”?

例如,将1添加到11111111 11111111 11111111 11111111时的表示是什么?

我问这个是因为我正在阅读一些代码并且我不知道是什么

 ~0 + 1

正在做。我的意思是,我们不能将1添加到4294967295吗?

谢谢!

5 个答案:

答案 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。因此~0uUINT_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然后我们在某个地方01在十位。如果我们的数字大于我们的位数,那么计数器只会翻到0并重新开始。

现在,这简化为谈论正数。如果int是有符号的,则从最大正数到最大负数并循环回到最大正数,最终对负数和正数以二进制形式存储的方式。

答案 3 :(得分:0)

2^32=4294967296

因此,2^32-1是32位无符号整数(32位二进制数字)的最大值。 2 ^ 32是可能值的数量 4294967295是因为整数从0开始,但我们的计数从1开始 这是一个整数范围,当你向这个数字加1时,它超出整数范围,这就是为什么我们不能将一个添加到4294967295.

+是一个加法算术运算符& -是减法算术运算符

答案 4 :(得分:0)

从技术上讲,C不会添加或提取。编译器将其转换为汇编代码,汇编代码转换为机器代码。架构应该有ADD指令。

我相信使用基本逻辑门可以通过多种方式完成操作。

无论如何,这个book都有一些信息。

您可能还感兴趣的是如何用二进制表示负数以及它如何适合算术运算。

使用的通用格式称为二重补充。您可以详细了解其工作原理here