计算机存储数据最终都是存储0和1。比如,现在存储一个正数12与一个负数-12,那么是以怎样的二进制存储在内存中的呢。

首先需要了解原码这个概念,也就是一个数值对应的二进制,对于正数就是其对应的二进制,负数就是在其正数的二进制基础上最高位为1。

那么-12与12的源码分别为:

1
2
1000 0000 0000 0000 0000 0000 0000 1100
0000 0000 0000 0000 0000 0000 0000 1100

那么计算机存储12与-12直接将上面的各自对应的二进制存储到内存单元中吗,答案是NO。如果这样直接存储的话,我们计算-12+12结果并非为0。那么计算机是怎样存储呢?

1
其实,数据在计算机中存储数值是以补码的形式进行存储的。

那么对于怎么获取一个数值的补码呢?先看下补码的特点

  • 对于正数,原码、反码、补码相同
  • 对于负数,其补码为它的反码加1
  • 补码符号位不,其它位求返,最后整个数加1,得到原码

那么12在内存中存储就是其对应的二进制数

1
0000 0000 0000 0000 0000 0000 0000 1100

对于-12首先得获取对应的反码,反码的特点:

  • 对于正数,反码与源码相同
  • 对于负数,符号位不变,其它部分取反(1变0,0变1)
1
-12反码:1111 1111 1111 1111 1111 1111 1111 0011

在-12的反码加1得到补码

1
-12补码:1111 1111 1111 1111 1111 1111 1111 0100

那么当12与-12相加计算出的结果为:

1
1 0000 0000 0000 0000 0000 0000 0000 0000

一个int类型占4个字节即32位,上面两者相加结果为33位,这里就涉及到了溢出的问题。此时操作系统的会向前进1,多于原始数据大小的位会被系统自动舍弃。