1. 整形在内存中的存储
原码、反码、补码
整数是以二进制补码的形式在内存中储存的。 对于有符号的整型,二进制的最高位代表符号位,0代表正数,1代表负数 原码、反码、补码之间的转换 正整数: 原,反,补是一样的。 负整数: 原码符号位不变,其他位按位取反得到反码, 反码加1变成补码.
2.类型转换
1.隐式类型转换
凡是低于int 类型的,在进行运算时都要转换为int 类型。这叫做整型提升 需要转换的类型 char unsigned char signed char short unsigned short 在c语言的标准中,并没有规定char是有符号的整型还是无符号的整型,完全取决你的编译器 当char表示有符号的整型是时,它所表示数值的范围为==-128~127== 当它是无符号的整型的时候,它所表示数值的范围为0~255 这就是有符号char从-128~127之间形成的一个圆环,当127+1之后会变成-128
short是有符号的类型,它和unsigned short 一样 看下面的代码,助你理解
int main()
{
char a = 0xb2;
整型提升为0xffffffb2
short b = 0xb200;
整型提升为0xffffb200
int c = 0xb2000000;
不需要提升
if (a == 0xb2)
printf("a\n");
if (b == 0xb200)
printf("b\n");
if (c == 0xb2000000)
printf("c\n");
return 0;
}
2.算术转换
在几个数在一起进行运算时,如果这几个数的类型不一样,就需要变成相同的类型进行运行,这就是普通的算术转换。 这几个类型从高到低排的序 long double double float unsigned long int long int unsigned int int 算术转换要有意义,高精度转换为低精度的时候会造成部分数据的缺失
3. 大小端字节序介绍及判断
注意:是以字节的大小储存的 大端字节序储存:数据的低位存在地址高的地方,数据的高位储存在地址低的地方. 小端字节序储存:数据的低位存在地址低的地方,数据的高位储存在地址高的地方. 请你编程实现:判断你的机器是哪种储存方式
int panduan()
{
int i = 1;
return *(char*)&i;
}
int main()
{
int ret=panduan();
if (ret == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
4. 浮点型在内存中的存储解析
浮点型在内存中的储存与整型是完全不一样的 对于一个32位浮点数,第一位表示符号位(用S表示),后面的8位表示指数位(用E表示),剩下的位表示有效位(用M表示) S:0表示正数,-1表示负数。 E:指数加上127位=为它的储存数,并且这8位表示的是无符号的数 M:它的范围在1~2之间,储存的时候不必要储存1,储存小数点后面的 例如:
float i=6.5;
二进制为110.1 1.101 *2^2
s为0
E为2+127=129
M为101 后面位用0进行填充
0 10000001 10100000000000000000000
16进制进行表示
0x40d00000
我们来看看计算机运行的结果 相信大家应该明白了吧! 这里有几个注意的地方: 1. 当E全部为全0时,指数位为1-127(1-1023(这是64位的时候)) ,有效位M不需要再加上1,这个一个非常接近±0的数。 2. 当E全部为全1时,这是一个非常大的数,±无穷。 除了这个两个注意的地方为,怎么存进去的就怎么取出来。 对与64位的浮点型,符号位后面的11位表示指数位,加上1023,其余的和32位浮点型的描述差不多.
福利:博主教你学习
企鹅裙:720429262
|