数据的存储(C语言)
1.原码,反码,补码
正整数:原码,反码,补码相同
负整数:需要套用公式计算
例: int a = -10;
10000000 00000000 00000000 00001010 原码 第一位是符号位 1代表负数
11111111 11111111 11111111 11110101 反码 除符号位,其余各位均取反
11111111 11111111 11111111 11110110 补码 在反码基础上+1
2.大端字节序与小端字节序
大端:把数据的低位字节序内容存放在高地址处,高位字节序的内容存放在低地址处
小端:把数据的低位字节序内容存放在低地址处,高位字节序的内容存放在高地址处
例:判断当前机器的字节序
只需要观测测试数据1在内存中如何存储即可 0x 00 00 00 01
小端:01 00 00 00
大端:00 00 00 01 从左至右,地址升高
int judge_sys()
{
int x = 0x1;
char* p = (char*)&x;
return *p;
}
int main(){
int res = judge_sys();
if(res==1)
printf("little endian\n");
else
printf("big endian\n");
return 0;
}
3. char 类型
unsigned char 0~255
signed char -128~127
下面的程序输出什么?
#include <stdio.h>
int main()
{
char a = -1;
//10000000 00000000 00000000 00000001 int -1 的原码
//11111111 11111111 11111111 11111110 -1的反码
//11111111 11111111 11111111 11111111 -1的补码
//11111111 -1保存在char类型,保留1字节的内容
signed char b = -1;
//11111111
unsigned char c = -1;
//11111111 最高位的1与符号位无关
printf("a=%d,b=%d,c=%d", a, b, c);
//11111111 11111111 11111111 11111111 a,b打印时,发生整型提升
00000000000000000000000011111111 c 无符号整型提升,高位补0
//-1 -1 255
return 0;
}
a,b,c中存的数据补码一样,但是由于类型不同,所以对数据的理解方式和处理方式不同
有符号类型整型提升,高位补符号位
无符号类型整型提升,高位补0
特殊的1000 0000(补码)
转为原码:1111 1111+1 要进位 1 0000 0000 表示-128
char 存储时的补码有如下可能
00000000 0
00000001 1
00000010 2
…
01111111 127
10000000 -128 特殊,直接被解读为-128
10000001 -127
…
11111110 -2
11111111 -1
127 -128 -127 是相邻的
4.浮点数的存储
任意一个2进制浮点数V可表示为:
(
−
1
)
S
∗
M
∗
2
E
{( - 1)^S}*M*{2^E}
(−1)S∗M∗2E
(-1)^S 表示符号位
M表示有效数字,介于1和2
M:1.XXXXXX
M只存1后面的XXXXX
对于32位浮点数:最高的1位是S,接着的8位是指数E,剩下的23位为有效数字
存E需要加中间值(float:+127)