主机字节序
CPU支持的数据类型基础:8位,16位,32位,64位,128位
多字节数据的存储:0x12345678。
方案一:高字节数据存储在地址大的一端,低字节数据存储在地址小的一端(小端机Little-endian,Intel CPU采用本存储方案)。
地址:1000H1001H1002H1003H
数据:0x780x560x34 0x12
方案二:高字节数据存储在地址小的一端,低字节数据存储在地址大的一端(大端机,有别的CPU采用本存储方案)。
地址:1000H1001H1002H1003H
数据:0x120x340x56 0x78
判断当前计算机是大端机还是小端机。
/* * 程序功能:判断当前计算机是大端机还是小端机。 * 小端机:多字节数据的低位字节存放在地址小的字节中 * 大端机:多字节数据的低位字节存放在地址大的字节中 * 注意:Intel CPU系列采用的是小端方式存储多字节数据! *///方法一:int x = 0x123456789;printf("%s
", (*((char*)&x)) == 0x78 ? "小端机" : "大端机");//把x的地址强转为char*类型,然后取这个指针所指的数据//方法二:union//共用体是所有数据类型共享同一个存储单元{int x;char c[4];} u;u.x = 0x12345678;printf("%s
", u.c[0] == 0x78 ? "小端机" : "大端机");
共用体内存表示: 青海干部培训学校 www.xjuganxun.com
网络字节序:多字节数据,网络通信时是先发送高字节数据,还是先发送低字节数据。
h: host主机; n: network; s: short; l: long
htons:把unsigned short类型从主机序转换到网络序;
htonl 把unsigned long类型从主机序转换到网络序;
ntohs 把unsigned short类型从网络序转换到主机序;
ntohl 把unsigned long类型从网络序转换到主机序;
现在的互联网发送采用的是大端机字节序模式。
数据对齐(alignment):
CPU在存储数据和取数据时,要求2n字节的数据它存储的起始地址必须能被2n整除,然后CUP才能够有效地在一个CPU周期之内取出这个数据(高效),否则CPU得用多个CPU周期取数,然后拼接成你想要取的数(效率低)。
//示例一:struct{char c;//1short s;//2int x;//4long l; //4float f;//4double d;//8} u;//应该是23字节printf("结构体大小为:%d字节!
", sizeof(u));//输出却是24字节,因为存在内存对齐printf("c的地址为:%p
", &u.c);printf("s的地址为:%p
", &u.s);printf("x的地址为:%p
", &u.x);printf("l的地址为:%p
", &u.l);printf("f的地址为:%p
", &u.f);printf("d的地址为:%p
", &u.d);//示例二:struct{short s;//2int x;//4char c;//1long l;//4float f;//4double d;//8} u;//应该是23字节printf("结构体大小为:%d字节!
", sizeof(u));//却是32个字节printf("s的地址为:%p
", &u.s);printf("x的地址为:%p
", &u.x);printf("c的地址为:%p
", &u.c);printf("l的地址为:%p
", &u.l);printf("f的地址为:%p
", &u.f);printf("d的地址为:%p
", &u.d);
示例二图示(示例一类似):
没全部画完
所以再声明数据类型时,最好把占字节数小的放一起,大的放一起,可以节省空间。
Intel CPU支持的数据类型:
整数(无符号整数8位,16位,32位,64位;带符号整数:8位,16位,32位,64位;浮点数:float 32位,double 64位;指针(近指针:内存段段内偏移;原指针:内存段段选择符+段内偏移);BCD码:位/字节/字/双字段;SIMD单指令流多数据流打包数据(字节、字、双字、四字))。
数据类型的四重含义:
1、占不同的存储单元数。
2、取值范围不一样。
3、允许的操作不一样。
4、二进制编码方案不一样(整数:二进制补码;浮点数:IEEE754标准;英文字符:ASCII码;汉字:内码;Java中,字符用Unicode编码(汉字的编码范围:'一' - '龥')。)
变量Variable就是内存单元的抽象,不同类型的变量占用不同数目的字节单元,用不同的二进制编码,有不同的存储范围,运行不同的操作。编程语言中的常量Constant和变量都有不同的数据类型。