C语言中的变量加法

Pav*_*mar 1 c

main(){char a,b,c; 一个= 6; B = 1-5; c = a + b; printf("%d%d%d \n",a,b,c); }

Here , what actually happens 

00000110
10000101 
--------
10000111
--------
So values c will -11 , then how come it is 1. 

Eli*_*sky 6

你的错误是:-5的二进制补码不是10000101.在32位它是:11111111111111111111111111111011

6,是:

00000000000000000000000000000110

总和是:

  11111111111111111111111111111011
+ 00000000000000000000000000000110
  --------------------------------
  00000000000000000000000000000001
Run Code Online (Sandbox Code Playgroud)

我建议你阅读这个关于签名号码表示的维基百科页面.现代CPU使用两个补码.


ken*_*ytm 6

看起来你混淆了2的补码和符号位的概念,以及C中的按位或加法.

(谁会期望6 +( - 5)≠1 ......)


(1)2的补码和符号位

在大多数架构中,负数被实现为其量级的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. 但只是翻转符号位并不能否定数字.它只是一个指标,表明该数字是否定的.


(2)C中的按位或加法

+表示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)