小端机大端机以及数据对齐

主机字节序

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和变量都有不同的数据类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值