重点:1.数据类型详细介绍
2.整型在内存中的存储:原码 反码 补码
3.大小端字节序介绍和判断
4.浮点型在内存中的存储解析
前面都有char short int...详细介绍,翻一翻.需要注意的是,C语言没有字符串类型哦.
计算机永远存储的都是补码,计算也是用补码进行的,只有在要输出的时候转化成原码.
int a = -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补
// F F F F F F F C
大小端
大端:数据的低位保存在内存的高地址,数据的高位保存在内存的低地址
小段:数据的低位保存在内存的低地址,数据的高位保存在内存的高地址
网络字节序---大端
int main(){
char a = -1;
signed char b = -1;
unsigned char c = -1;//1000 0001
//1111 1110
//1111 1111 FF
printf("a = %d,b = %d,c = %d",a, b, c);
return 0;
}
a = -1,b = -1,c = 255
int main(){
char a = -128;
//1000 0000
//1000 0000 0000 0000 0000 0000 1000 0000
//1111 1111 1111 1111 1111 1111 0111 1111
//1111 1111 1111 1111 1111 1111 1000 0000
//4294967168
printf("%u\n",a);
system("pause");
return 0;
}
浮点数的存储
#include<stdio.h>
int main(){
float f = 1.125;// (-1) ^ s * m * 2 ^ e ==> s = 0 m = 1.125 e = 0
system("pause");
return 0;
}
#include<stdio.h>
int main(){
float f = 10.125;//1010.001 (-1)^s*m*2^e
system("pause");//1.010001 (-1)^s*
return 0; //10.125
} //1010.001(小数化二进制的乘二取整法)0.125*2=0.25 -> 0;0.25*2=0.5->0; 0.5*2=1->1
//1.010001 *2^3
//(-1)^s*m*2^e s=0 m=1.01001 e=3
按照 s(一位) e(八位) m(二十三位)的顺序写,其中m减去1只要小数点后面的,e加中间数127再转成二进制
e全为0时 指数e=1-127,有效数字m不再加上第一位的1,而是还原为0.xxxxxxxx的小数,无限接近于0;
e全为1,这时如梭有效数字m全为0,表示无穷大(正负取决于符号位)
#include<stdio.h>
#include<stdlib.h>
struct test{
int a;
double b;
struct test t;
};
int main(){
struct test tt;
system("pause");
return 0;
}
这样是不行的,结构体中调用这个结构体会造成无限递归.
但如果把结构体参数换成指针就可以.
#include<stdio.h>
#include<stdlib.h>
struct test{
int a;
double b;
struct test *t;
};
int main(){
struct test tt;
system("pause");
return 0;
}
结构体字节对齐
(1)各种数据类型需要按照一定的规则在空间上排列,而不是顺序的一个接一个排放,这就是对齐
它是一种时间换空间的策略.(可以空出一些空间减少访问次数)
//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)
struct test{
int a; //1 + 7
double b; //8从上往下看,开辟的空间要是下面的整数倍(现在就是16,4的4倍)
struct test t; //4 + 4
};
这就是24个字节;
(2)变量a b t的顺序也会影响
struct test{
int a; //1 + 3
struct test t; //4
double b; //8从上往下看,开辟的空间要是下面的整数倍
};
这样就是16个字节
(第三中情况)要求他按照两个字节对齐,程序指定对齐值和程序有效对齐值就是2,这样就要求开辟空间是2的整数倍,而不是看最大的8了.
//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)
//程序指定对齐值
//程序有效对齐值
#pragma pack(2)
struct test{
int a; //1 + 1
struct test t; //4
double b; //8
};
这样就是14个字节.