1. 整数在内存中的存储
在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
2. ⼤⼩端字节序和字节序判断
#include <stdio.h>int main()
{
int a = 0x11223344;return 0;
}
2.1 什么是⼤⼩端?
是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存在内存的低地址处。
⼩端(存储)模式:
是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存在内存的⾼地址处。
例如10进制中的123,1、2、3分别是百位,十位,个位,那么3就是低位。
上述概念需要记住,⽅便分辨⼤⼩端。
2.2 为什么有⼤⼩端?
2.3 练习
2.3.1 练习1
//代码1
#include <stdio.h>
int check_sys()
{int i = 1;return (*(char *)&i);
}
int main()
{int ret = check_sys();if(ret == 1){printf("⼩端\n");}else{printf("⼤端\n");}return 0;
}
解题思路:这里将&i的int*地址强制转化为(char*),而不是将int强制转化为char。
2.3.2 练习2
#include <stdio.h>
int main()
{char a= -1;signed char b=-1;unsigned char c=-1;printf("a=%d,b=%d,c=%d",a,b,c);return 0;
}
无论是否有无符号位,存入内存的都是补码,11111111,至于打印出来是什么,这时候就与signed、unsigned有关了。
%d意思就是我以有符号数的形式打印
a、b:char类型的要以%d的形式打印,需要整型提升,有符号位,那就补符号位变为11111111 11111111 11111111 11111111
补码转化为原码就是1000000...0001:-1
c:无符号位,整型提升补充0,00000....11111111,正数,原反补相同,打印结果为255
2.3.3 练习3
#include <stdio.h>
int main()
{char a = -128;printf("%u\n",a);return 0;
}
这里char a = -128意思是以8个比特位的方式存储a的补码,多余的比特位不要,所以存入的是10000000,打印的时候是以%u(%u认为打印的为无符号数int,%d认为是有符号数int),先对a进行整型提升,看a的类型是char,有符号位的char,10000000的高位是符号位1,所以补符号位1,之后再打印时打印的是无符号位,打印结果为11111111 11111111 11111111 10000000的10进制
2.3.4 练习4
#include <stdio.h>
int main()
{char a[1000];int i;for(i=0; i<1000; i++){a[i] = -1-i;}printf("%d",strlen(a));return 0;
}
for循环对数组进行赋值,-1,-2...-128,由于char是有符号位,其范围为-128~127,接下来会存储
127,126.。。。
strlen求得是字符串的长度,统计的是\0(ASCII码值是0)之前的字符个数,当循环了一个周期后,输出255。
2.3.5 练习5
#include <stdio.h>
unsigned char i = 0;
int main()
{for(i = 0;i<=255;i++){printf("hello world\n");}return 0;
}
由于unsigned char类型最多储存255个,到达255后又会回到0,所以永远满足i<=255,会死循环的打印
3. 浮点数在内存中的存储
3.1 练习
#include <stdio.h>
int main()
{int n = 9;float *pFloat = (float *)&n;printf("n的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);*pFloat = 9.0;printf("num的值为:%d\n",n);printf("*pFloat的值为:%f\n",*pFloat);return 0;
}
3.2 浮点数的存储
V = (−1) ^ S ∗ M ∗ 2^ E• (−1) S 表⽰符号位,当S=0,V为正数;当S=1,V为负数• M 表⽰有效数字,M是⼤于等于1,⼩于2的• 2 E 表⽰指数位
32位与64位指的是存储的bit位
3.2.1 浮点数存的过程
3.2.2 浮点数取的过程
0 01111110 00000000000000000000000
E全为0
0 00000000 00100000000000000000000
0 11111111 00010000000000000000000
与E=0同理,推出无穷大
3.3 题⽬解析
0000 0000 0000 0000 0000 0000 0000 1001
0 00000000 00000000001001S E M
9.0(10进制)
1001.0(2进制)= (-1)^0 * 1.001 * 2^3
S=0 M=001 E=3+127=130(10进制),10000010(2进制)
pFloat存入内存中则为
0 10000010 001.....(20个0)
以有符号数&d打印出
将0 10000010 001.....(20个0)转化为10进制就为结果
————————————————————————————————
完