计算机内存数值存储方式

1)原码:一个数的原码(原始的二进制码)有如下特点:

  • 最高位做为符号位,0表示正,1表示负
  • 其它数值部分就是数值本身绝对值的二进制数
  • 负数的原码是在其绝对值的基础上,最高位变为1
  • 原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算

eg:char ch=10//char类型在内存中占1个字节,8位

原码:0000 1010//2^3+2^1

char ch1=-10

原码1000 1010

2)反码

  • 对于正数,反码与原码相同
  • 对于负数,符号位不变,其它部分取反(1变0,0变1)
  • 反码运算也不方便,通常用来作为求补码的中间过渡

eg:char ch=10//char类型在内存中占1个字节,8位

原码:0000 1010

反码:0000 1010

char ch1=-10

原码:1000 1010

反码:1111 0101

3)补码

  • 对于正数,原码、反码、补码相同
  • 对于负数,其补码为它的反码加1
  • 补码符号位不动,其它位求反,最后整个数加1,得到原码
  • 在计算机系统中,数值一律用补码来存储

eg:char ch=10//char类型在内存中占1个字节,8位

原码:0000 1010

反码:0000 1010

补码:0000 1010//十六进制为0a

在内存中以十六进制0a进行存储,一个单元格表示1个字节,8位

 

 

 

 

 

 

char ch1=-10

原码:1000 1010

反码:1111 0101

补码:1111 0110//十六进制为f6

 

 

 

 

 

 4)计算机系统中,数值一律用补码来存储,主要原因是:

  • 统一了零的编码

//0在计算机中存储的方式:ina a=0;              int b=-0;

                                           0000 0000          1000 0000

为了统一0的编码,计算机中没有-0的概念

  • 将符号位和其它位统一处理//在数据计算中,符号位也参与程序的计算
  • 将减法运算转变为加法运算//计算机只会算加法10+(-10)
  • 两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

ch-ch1=0;    ch补码:0000 1010

10+10        ch1补码:1111 0110

                  =1 0000 0000//最高位(符号位)有进位,则进位被舍弃

        =0000 0000

eg:76-32 =44  76原码:0100 1100  76反码:0100 1100  76补码:0100 1100

76+(-32)       -32原码:1010 0000  -32反码:1101 1111   -32补码:1110 0000

                              =1 0010 1100//舍去

                            补码=0010 1100//如果符号位发生变化,数的值也发生变化

                            反码:0010 1100

                            原码:0010 1100=44

 

eg:76-82 =-6  76原码:0100 1100  76反码:0100 1100  76补码:0100 1100

       -82原码:1101 0010    -82反码:1010 1101    -82补码:1010 1110  

                                 补码=1111 1010

                               反码:1111 1001

                             原码:1000 0110=-6 

数值不能超过127,否则数据溢出                            

posted @ 2020-08-04 09:26  wh19991213  阅读(811)  评论(0编辑  收藏  举报