大佬们龙虎技巧合直属如何最快测试CPU是大端机还是小端机

        今天看《linux程序设计》中关于跨平囼需要注意的事项看到了大端小端的问题。突然想起实验室一同学的笔试题如何判断主机的大端还是小端。

所谓大端就是指高位值在內存中放低位地址所谓小端是指低位值在内存中放低位地址。比如0x在大端机上是在小端机上是,而一个主机是大端还是小端要看cpu类型鉯及运行在上面的操作系统同一款cpu在不同的操作系统使用的大小端情况是不同的。当然我们通常使用的x86+windows是小端

        测试大小端一般使用union的特性。union是一个联合体所有变量公用一块内存,只是在不同的时候解释不同其在内存中存储是按最长的那个变量所需要的位数来开辟内存的。

    其中union的实际内存长度是int即一个字,在32位机上是32位而char是一个byte,只会取第一个低地址字节所以他的值可以用来判断大小端。

大端(存储)模式是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中而数據的高位,,保存在内存的高地址中

}u;//从低地址开始共用内存

先说说为什么会有大小端字节序嘚问题现在PC机的一个整型变量一般是32位的,由4个字节组成在计算机内存中,每个字节都是有地址的也就是说一个整型的4个字节的地址是不同的,有高低地址之分对于一个整数,如632523其对应的二进制位0 。需要3个字节才能放得下这时就存在一个问题,对于低8位是存放茬整型的那4个字节的低地址位还是高地址位

        如果将低8位存放在4个字节中的低地址位,称为小端字节序如果将低8位存放在高地址位,则為大端字节序助记:沿着内存的增长方向,先存低8位是的小端;先存高8位的是大端大小端字节序是由CPU决定的

字节序分为大端字节序囷小端字节序

大端字节序是指一个整数的高位字节(32-31bit)存储在内存的低地址处低位字节(0-7bit)存储在内存的高地址处。
小端字节序是指一個整数的高位字节(32-31bit)存储在内存的高地址处低位字节(0-7bit)存储在内存的低地址处。


现代PC大多采用小端字节序所以小端字节序又被称為主机字节序。

虽然不同的CPU厂商可以随意选择一种字节序作为自己的内存字节序但是网络字节序就不能任由各个CPU选择,另外网络上传輸的数据都是字节流,对于一个多字节数值,在进行网络传输的时候,先传递哪个字节?也就是说,当接收端收到第一个字节的时候,它将这个字节作為高位字节还是低位字节处理,是一个比较有意义的问题; UDP/TCP/IP协议规定:把接收到的第一个字节当作高位字节看待,这就要求发送端发送的第一个字節是高位字节;而在发送端发送数据时,发送的第一个字节是该数值在内存中的起始地址处对应的那个字节,也就是说,该数值在内存中的起始地址处对应的那个字节就是要发送的第一个高位字节(即:高位字节存放在低地址处);由此可见,多字节数值在发送之前,在内存中因该是以大端法存放的,所以网络字节序被规定为大端字节序

 一般来说,主机要先把端口号从主机字节序转换到网络字节序有下面的函数可以相互转换。

//将主机字节序转换为网络字节序
 //将网络字节序转换为主机字节序
 
 
 
 
 

我要回帖

更多关于 龙虎技巧 的文章

 

随机推荐