C语言整数编码

整数的正负表示

有符号数: 最高位作符号这种表示的整数叫做有符号数(有正负之分)。

最高位作符号位1表示负数0表示正数

如果用1个字节(8位)表示整数,那么:

    1111000:负数

    0111000:正数


无符号数:无负数,表示0和正整数,最高位无需表示正负。


一个字节的整数

有符号[-128:127]

无符号[0,255]


整数的编码:原码

原码就是在数值前面增加一位符号数(即最高位为符号数)该位为0表示正数,该位为1表示负数,其余位表示数值的大小。

小例子:以一个字节作为整数的存储

        1:  00000001

       -1: 10000001

那么1-1=1+(-1) = 00000001 + 10000001 = 10000010 = -2是错误的,符号位无法参加运算。


整数的编码:反码

    正整数的反码就是其自身,而负整数的反码可以通过对其绝对值逐位求反来求得。以一个字节作为整数得存储长度为例子。

小例子:以一个字节作为整数的存储

    1:  00000001

   -1: 10000001 => 11111110

那么1 – 1 = 1 + (-1) = 00000001 + 11111110 = -0

反码的问题出现在(0)和(-0)上,因为在人们的计算概念中零是没有正负之分的。


整数的编码: 补码

    正数的补码为它本身,负数的补码就是它的绝对值求反加1。

    如果一个二进制数是负数1001100怎么才能知道它原来的数呢?还是取反加1

    0的补码是0

    100的补码: 1100100

    1的补码00000001

    -1的补码00000001->11111110+1 = 11111111

    127的补码01111111

    -128的补码10000000 -> 01111111+1=10000000

    47的补码00101111

    -47的补码11010000 + 1 = 11010001

补码的好处 0是唯一的好处 符号位可以参与计算

扩充 一个字节的补码扩充到2个字节,4个字节;

正数 零扩充

负数 符号位扩充

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容