汉扬编程 编程大纲 计算机大小端介绍以及数据转化

计算机大小端介绍以及数据转化

字节顺序(Endianness)在计算机科学中指组成字(Word)的字节(Byte)的排列顺序。例如在C语言中,通过sizeof函数可以打印出变量占用的字节数。

计算机大小端介绍以及数据转化

printf("%lu\\n", sizeof(int));输出为4,说明int型的变量占用4个字节。

假设一个int x = 0x01234567,它的首地址为0x100,那么4个字节的存储位置分别是0x100, 0x101, 0x102, 0x013。

字节序

如果将高位存在低地址,那么就是大端序(Big endian),如果将低位存在低地址,那么就是小端序(Little endian)。

void showBytes(unsigned char* start, size_t len) { for (int i = 0; i < len; i++) printf(" %.2x", start[i]); printf("\\n");}int main(int argc, char** argv) { int x = 12345; // 0x00003039 showBytes(reinterpret_cast<unsigned char*>(&x), sizeof(x)); return 0;}使用以上程序在Linux 64位系统中运行,输出为39 30 00 00,说明系统为小端模式,利用该原理很容易判断计算机的字节顺序。

操作系统的大小端模式「C/C++」

什么是大小端模式?

计算机大小端介绍以及数据转化

大小端存储由 CPU架构 决定。

计算机大小端介绍以及数据转化

大端模式( big endian ):低地址存在高位数据,高地址存在低位数据;

计算机大小端介绍以及数据转化

小端模式( Little Endian ):低地址存在低位数据;高地址高位数据;

例如:

使用大端模式的有:Mac OS、PowerPC、IBM、Sun、 TCP/IP网络数据流;

使用小端模式的有:x86、Linux;

而ARM可以是大端模式,也可以是小端模式;

我们都知道在计算机内存中有大端和小端之分。。。

大端模式地址由小向大增加,而数据从高位往低位放;小端模式数据的高字节在高地址中,低字节在低地址中。

为什么会有大小端模式之分呢?

下面用这张图回答!

那么,知道了大小端的原理,该如何判断一台机器是大端模式还是小端模式呢??

下面我介绍两种判断大小端的方法:

1.通过不同指针类型所指不同内存大小来判定

定义一个变量 int i = 0;

假设i在内存中这样存储:

将i的地址取出来并强制类型转换成(char*)型,这样p所能指向的对象即整型 i 的第一个字节,这样在对p进行解引用,根据*p的值判断大小端:

若 *p == 0; 说明 i 在内存中确实如上图存储,高位在低地址,低位在高地址,为大端模式。。。

若 *p == 1;则说明 i 在内存中是将低位存在低地址,高位存在高地址,为小端模式。。。

代码:

int check_sys(){ int i = 1; char* p = (char*)&i; return *p == 1 ? 1 : 0;}2.利用联合体进行判断

联合体的特性:

联合体所有成员变量共享内存,相对于联合体首地址偏移量都为 0同一时间只能存储1个被选择的变量,对其他成员变量赋值会覆盖原变量思路:由于联合体的所有成员引用的都是内存中的相同地址,

举个例子:

声明一个联合体

union n{ int a; char b;};定义一个联合体 :union n s;

很明显,在32位平台下此结构体总大小为4个字节。

假设在 1 在内存中如下存储:低位存在高地址,高位存在低地址,我们给s这个联合体中a赋值1,即s.a = 1。即s.a 在内存中如下存储。。

并且由于联合体的覆盖特性,我们从此联合体中取s.b,由于s.b是一个字符型,在取时只能取一个字节;

联合体union的存放顺序是所有成员都从低地址开始存放;必然也是从低地址开始读取:

因此:

若 s.b = 0;即说明高位存在低地址,上面假设正确,为大端模式。。

若 s.b = 1;编译器将低位存放在了低地址,说明上面假设不成立为小端模式。。

测试代码:

typedef union n{ int a; char b;}n;int main(){ n s; s.a = 1; if (s.b == 1) { printf("Little\\n"); //小端 } else { printf("Big\\n"); //大端 } system("pause"); return 0;}<注:以上数据存储为32位计算机。>

本文来自网络,不代表汉扬编程立场,转载请注明出处:http://www.hyzlch.com/mianfei/6849.html

C|大端、小端字节序各自优势及判断

Linux C Socket 编程

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

返回顶部