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
看一下