你的错误是:-5的二进制补码不是10000101.在32位它是:11111111111111111111111111111011
6,是:
00000000000000000000000000000110
总和是:
11111111111111111111111111111011
+ 00000000000000000000000000000110
--------------------------------
00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)
我建议你阅读这个关于签名号码表示的维基百科页面.现代CPU使用两个补码.
看起来你混淆了2的补码和符号位的概念,以及C中的按位或加法.
(谁会期望6 +( - 5)≠1 ......)
在大多数架构中,负数被实现为其量级的2的补码.虽然C标准没有强制使用2的补码,但它是最受欢迎的.在2的补码中,负数x被构造为~x + 1例如
5 = 0000 0101
~5 = 1111 1010 # ~x means 1's complement, a.k.a. bitwise-NOT
~5+1 = 1111 1011 # +1 means add 1 to the integer.
Run Code Online (Sandbox Code Playgroud)
这是-5的二进制表示.整数的最高位称为符号位,因为它确定整数的符号.2的补码中的所有负整数都有符号位= 1. 但只是翻转符号位并不能否定数字.它只是一个指标,表明该数字是否定的.
+表示C和所有其他实用语言中的整数加法,因为整数加法比按位或更有用.因此,虽然OR +在逻辑证明中被广泛编写,但是没有编程语言可以识别+按位OR.
在C中,a char只是一个有符号整数,正好是1个字节长.行为与所有其他类型的有符号整数相同.您必须使用|按位OR.
0000 0110 0000 0110
+ 1000 0101 | 1000 0101
——————————— ———————————
1000 1011 1000 0111
^^--- note the carry ---^^
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1690 次 |
| 最近记录: |