C语言中的数据类型
我们知道C语言中有char,short,int,double等一些内置类型,以及struct,enum,union这样的自定义类型。根据使用情况可以分为,整形,浮点类型,构造类型,指针类型,空类型几类。这是C中最基本的知识。
大小端的概念
首先在计算机系统中,CPU的编址,寻址和访问内存都是以字节为单位的。以一个十六进制数0x12345678为例,它的12是高权值位,78是低权值位。 一个四个字节的连续空间,假设编址为0xF1,到0先F4,如果12,存储在0xF1处,78存储在0xF4处,就是高权值位存储在低地址,低权值位存储在高地址处。表示机器是大端字节序存储。如果12存储在0xF4处,78存储在0xF1处,就是高权值位存储在高地址,低权值位存储在低地址,表示机器是小端字节序存储。这就是所谓大小端的概念。
整形在内存中的存储
整形数据在内存中以补码的形势存储,二进制数最高位为符号位,规定0表示正,1表示负。将一个整形数据按照正负数表示成二进制的形式就得到了它的原码,将原码的符号位不变,其他位按位取反得到反码,反码加上1得到补码。规定正数的原码反码补码相同。例如定义一个变量 int a = 20; 它的原码就是 0000 0000 0000 0000 0000 0000 0001 0100 定义一个变量 int a = -20:它的原码就是 1000 0000 0000 0000 0000 0000 0001 0100 反码等于原码符号位不变其他位按位取反,反码: 0111 1111 1111 1111 1111 1111 1110 1011 补码等于反码加上1 0111 1111 1111 1111 1111 1111 1110 1100
一个判断大小端的程序
#include<stdio.h>
int CheckModle() {
int a = 1;
char* pc = (char*)&a;
return *pc == 0;
}
int main() {
int flag = CheckModle();
if (flag) {
printf("Big\n");
}
else {
printf("Small\n");
}
return 0;
}
浮点数在内存中的存储
单精度浮点数在内存中的存储: 国际标准IEEE 754规定一个二进制浮点数可以表示为: (-1) ^ S * M * 2 ^ E 在计算机内部存储M时,默认这个数第一位总是1,因此可以舍弃,可以多保存一位有效数字。而存储E时,标准规定,8位的E必须加上中间数127,11位的E必须加上中间数1023。
具体转化过程举例完成,例如,定义一个单精度浮点数 float f = 12.125; ①首先12.125转化为二级制为 1100.001。 ②科学计数法表示为(-1)^ 0 * 1.1100001 * 2^3。 ③正数,所以符号位S为0,尾码E为3,阶码M为1.100001舍弃1保留100001 ④存储时尾码加上中间数127 实际存储的是130,二进制为1000 0010 ⑤在内存中的二进制序列为 0100 0001 0100 0010 0000 0000 0000 0000 还原数据时规则有所不同,当E为全0时候,有效数字M 不再加上第一位的1,为了表示很小的数。E全为1时,如果有效数字M的值为全0,表示±无穷大的数。
双精度浮点数的存储方法相同,对于64位的双精度浮点数,一个比特位的符号位S,接着11个位的E,以及52位的M。
|