有符号数与无符号数

发布时间 2024-01-07 12:06:48作者: hirokoyo

如果数据宽度为一个字节,那么存储的数据范围就是:0-0xFF

那么这个字节里面的数据代表什么意思呢?

01010101  0x55

如果这样问的话,没有人能答出来这个数代表什么

为什么呢,如果我告诉你这里边存储的是一个文本文件,那你可能知道了,这个01010101代表的是一个逗号,那如果我告诉你这是一个程序,那你可能知道了,这代表的是一个指令,因为我们知道,在计算机中任何文件存储的都是0和1,那不同的文件0和1代表的含义肯定是不一样的,那么我告诉你这里边存储的是一个无符号的数,你告诉我他的值是多少?不同的文件有不同的编码规则

1、无符号数的编码规则

这个数是多少就是多少

比如10011010

那么这个数就是0x9A,十进制是154

2、有符号数编码规则

原码:最高位为符号位,其余各位为数值本身的绝对值

反码:

  正数:反码与原码相同

  负数:符号位为1,其余位对原码取反

补码:

  正数:补码与原码相同

  负数:符号位为1,其余位对原码取反加1

 

首先要确定数据的宽度

比如我们用字节(BIT)存储以下数

1,-1,-7

1 0000 0001原码

   0000 0001反码

   0000 0001补码

正数的补码和原码相同, 在内存中存储的方式,我可以说是原码,补码,反码都可以

-1 1000 0001原码

     1111 1110反码

     1111 1111补码,用16进制书写就是0xFF

所以负数是以补码的方式存储在内存中的

-7 1000 0111原码

    1111 1000反码

    1111 1001补码,用16进制书写就是0xF9

3、存储范围

字节(Byte)

无符号数:0-FF

有符号正数:0-FF

有符号负数:FF-80

双字(DoubleWord)

无符号数:0-FFFF

有符号正数:0-FFFF FFFF

有符号负数:FFFF FFFF-8000 0000

总结:

正数以原码存储

负数以补码存储