C 数据存储原码,补码,反码计算

0x01整形

无符号的整数 原码,补码,反码相同

有符号的整数 

正数:原码,补码,反码相同

负数:原码,补码,反码不相同,要进行计算

加法计算就是补码计算 

    int a = 20;
    //0000 0000 0000 0000 0000 0000 0001 0100 -原码
    //0000 0000 0000 0000 0000 0000 0001 0100 -反码
    //0000 0000 0000 0000 0000 0000 0001 0100 -补码
    //0x00 00 00 14
    int b = -10;
    //1000 0000 0000 0000 0000 0000 0000 1010 -原码
    //1111 1111 1111 1111 1111 1111 1111 0101 -反码
    //1111 1111 1111 1111 1111 1111 1111 0110 -补码
    //0x ff ff ff f6

低位高存

 

 0x02 字符

    char a1 = -1;
    //11111111
    signed char  b2 = -1;
    //11111111
    unsigned char b3 = -1;
    //00000000 00000000 00000000 11111111
    printf("%d,%d,%d", a1, b2, b3);
    //-1 -1 255

需要记住的是-1 的补码就是1111....

char 高位为1转成int就是高位补24个1

signed char 和char 一样

unsigned char 标识是0补24个0  转成int就是255

在看这个例子

    char a = -128;
    //1000 0000
    printf("%u",a);

输出4294967168  为什么呢 实际上 -128 就是 127+1

char a=127+1   由于负号a在转无符号int

1000 0000 0000 0000 0000 0000 1000 0000 -原码 

1111 1111 1111 1111 1111 1111 0111 1111-反码

1111 1111 1111 1111 1111 1111 1000 0000 -补码 

转成无符号整形就是429.。。

signed char 的取值范围就是 -128~127

unsigned char 的取值范围就是 0~255

看一下负数计算

    int i = -20;
    unsigned int j = 10;
    printf("%d", i + j);
    //i的值
    //10000000 00000000 00000000 00010100 -原码
    //11111111 11111111 11111111 11101011 -反码
    //11111111 11111111 11111111 1110 1100 -补码
    //j的值
    //00000000 00000000 00000000 0000 1010 补码
    //相加
    //11111111 11111111 11111111 1111 0110 补码
    //11111111 11111111 11111111 1111 0101 反码
    //10000000 00000000 00000000 0000 1010 原码
    //计算 就是 -10

0x03浮点

float x = 58.25f;

他是怎么在内存了存储的呢

先把

58转换为二进制:

58/2=29 余0

29/2=14 余1

14/2=7  余0

7/2=3   余1

3/2=1   余1

1/2=0   余1

从下往上取余数111010

58.25的二进制就是

111010 

小数部分

0.25*2=0.5 取个位0

0.5*2=1 取各位1

连接在一起就是

111010.01 用科学计数法

1.1101001 *10^5

他是有一个公式

(-1)^0*1.1101001 *10^5

(-1)^s *M   *10^e

s -0

m- 1.1101001

e-5

 

 

32位的浮点数,最高位符号s  接着是指数E,剩下的是23位有效数字M

e的起始值就是127  在加+5 132  我们知道128是10000000 就是128+4

尝试拼接

0 1000 0100   1101 0010 0000 0000 0000 000

s      e             m

划分一下

0100 0010 0110 1001 0000 0000 0000 0000

4         2        6      9     0       0          0     0

00 00 69 42 

看一下

 

posted @ 2021-04-17 16:18  紅人  阅读(341)  评论(0编辑  收藏  举报