深剖整形在内存中是怎么存储的-C语言

整形在内存中的存储

整形在内存中以补码形式存储
复制代码


原因:

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,
可以将符号位和数值域统一处理; 
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,
其运算过程是相同的,不需要额外的硬件电路
复制代码

1 + (-1)
假设使用原码计算:
1的原码:  00000000 00000000 00000000 00000001
-1的原码: 10000000 00000000 00000000 00000001
    -----------------------------------------
         10000000 00000000 00000000 00000010 ->-2
         
   所以1+(-1) -2 //err
复制代码

1 + (-1)
   假设使用补码计算
1的原码:00000000 00000000 00000000 00000001 
1的补码:00000000 00000000 00000000 00000001 
   正数原反补相同
-1的原码:10000000 00000000 00000000 00000001 
    反码:11111111 11111111 11111111 11111110
    补码:11111111 11111111 11111111 11111111
    
  两个补码运算
      00000000 00000000 00000000 00000001 
    + 11111111 11111111 11111111 11111111
   -----------------------------------------
   1  00000000 00000000 00000000 00000000    
      计算出进位,有33位,但是只取32位->结果为0
复制代码


原码反码补码

深剖整形在内存中是怎么存储的-C语言


已知补码求原码:

方法1:对补码A求补码B求出的补码B就是补码A的原码

方法2:

补码-1 ->反码

反码按位取反(符号位不变)->得到原码



例:
   已知补码:11111111 11111111 11111111 11111111 求原码
    
      11111111 11111111 11111111 11111111
 方法1:对补码再求补码,把要求的补码当成原码,求出来的补码就是原码
       11111111 11111111 11111111 11111111-原码
       10000000 00000000 00000000 00000000-反码
       10000000 00000000 00000000 00000001-补码
    得出的该补码10000000 00000000 00000000 00000001,就是要求的11111111 11111111 11111111 11111111补码的原码->值为-1
复制代码
方法2:
   补码 - 1   -> 反码
  11111111 11111111 11111111 11111110 ->反码
    反码按位取反(符号位不变) ->原码
  10000000 00000000 00000000 00000001 ->原码
    该原码的值为-1
复制代码


上一篇:[LeetCode] Minimum Path Sum


下一篇:操作符这块,你可得把握住(上)