计算机系统中的地址和字节序(字节是计算机中)

对于程序中跨越多个字节的对象,必须建立两个常识:

  1. 这个对象的地址是什么;
  2. 内存中的字节是如何排列的

在所有的机器中,多字节对象是以连续内存进行存储的,最小的字节地址就是对象的地址。比如定义

int x = 0x01234567;

假设它的地址是0x100,也就是说对x进行取地址(&x)等于0x100,假设int类型有3个字节,那么其它字节在内存0x101, 0x102, 0x103的位置。

对于这个对象,有两种常规的排列方式,定义一个w为的整形[Xw-1, Xw-2, ..., X1, X0],Xw-1是最高位,X0是最低位。假设w是8的整数倍,那么这些位可以被分为多个字节,最高字节可以表示为[Xw-1, Xw-2, ..., Xw-8],最低字节可以表示为[X7, X6, ..., X0]。

有些机器从最低字节到最高字节存储,另外一些机器从最高字节到最低字节存储,前者称为(Little Endian)小端,后者称为(Big Endian)大端。

假设x的值为0x01234567,那么字节的分布如下

计算机系统中的地址和字节序(字节是计算机中)

大小端

大端的最高字节是0x01,而小端是0x67。

多数的Intel机器是小端,多数的IBM或者Oracle是大端,最近很多微处理器是双端模式,意味着它们可以被配置为大端或者小端。实际上,一旦操作系统被确定,那么机器的大小端也随之确定。比如ARM微处理器的硬件既可以是大端,也可以是小端,但是最常用的两大系统Android和Apple都是小端。

人们对于哪种字节序正确,投入了极端的情绪,大端和小端的说法来自于小说《格列弗游记》,他们在讨论熟鸡蛋是从大端打开还是从小端打开,还由此引发战争。和鸡蛋问题类似,选择哪种顺序并不是技术问题,而是不同人的习惯。

计算机系统中的地址和字节序(字节是计算机中)

Endian

只要一种排序被选择,然后一直坚持,那么无论哪种选择都是可以的。

对于大多数的应用开发者来说,字节序问题是不会碰到的,运行的程序都能给出相同的答案。然后有时候,程序员需要考虑字节序。

第一个例子是二进制数据在不同的机器间进行网络传输,如果一个小端机器将数据送给大端机器,那么就会出现问题,另外一端会收到相反的数据。为了避免这个问题,网络传输需要定义一种标准的字节序,然后机器根据字节序的不同进行转换。

第二个例子是查看一个整形的字节序列,经常在底层程序中见到。比如x86-64处理器的底层代码

4004d3: 01 05 43 0b 20 00 add %eax,0x200b43(%rip)

上述语句是通过反汇编器生成的,生成程序的可执行序列。01 05 43 0b 20 00的意思是将地址0x200b43的值和程序计数器(寄存器)相加,得到值存入到0x200b43中。

如果我们拿到最后四个字节43 0b 20 00,取相反的顺序得到00 20 0b 43,去掉开头的00,得到0x200b43地址。对于小端的机器来说,汇编程序的地址都是相反的。通常来说最低位在左边,最高位在右边,但是小端的机器与之相反,最高位在右边,最低位在左边。

第三个例子就是类型转换或者C语言中的Union关键字,运行对象的不同部分被访问,不鼓励应用程序这样进行编程,但是有时对于系统编程来说是必须的。

下图展示了如何通过类型转换访问和打印不同对象的字节地址的内容

#include
typedef unsigned char* byte_pointer;

计算机系统中的地址和字节序(字节是计算机中)

void show_bytes(byte_pointer start, size_t len) {
int i;
for (i = 0; i < len; i++)
printf(" %.2x", start[i]);
printf("\n");
}
void show_int(int x) {
show_bytes((byte_pointer) &x, sizeof(int));
}
void show_float(float x) {
show_bytes((byte_pointer) &x, sizeof(float));
}
void show_pointer(void* x) {
show_bytes((byte_pointer) &x, sizeof(void*));
}
void test_show_bytes(int val) {
int i_val = val;
auto f_val = (float) i_val;
int* p_val = &i_val;
show_int(i_val);
show_float(f_val);
show_pointer(p_val);
}
int main(int argc, char* argv[]) {
int val = 12345;
test_show_bytes(val);
}

使用typedef定义一个指向unsigned char类型的指针类型别名,这个指针指向一块非负数的连续内存地址,show_bytes()函数打印指针指向的地址内容,%.2x表示以16进制输出

39 30 00 00
00 e4 40 46
f8 76 34 6f 01 00 00 00

show_int(), show_float(), show_pointer()是通过类型转换对show_bytes()函数进行封装,理解上述代码需要一定的C语言基础。sizeof()函数计算对象需要的字节数,使用sizeof进行计算,而不是写入固定值,是写可移植程序的基础。

变量12345的16进制表示为0x00003039,对于int类型,获取到相同的数值,只是字节序可能相反,本机0x39在最前面输出,说明是小端机器。浮点型数据对于同一个数值的编码是不同的

计算机系统中的地址和字节序(字节是计算机中)

数字编码

12345的浮点数表示为0x4640E400,小端表示顺序相反。

以上内容来源于网络,由“WiFi之家网”整理收藏!

原创文章,作者:电脑教程,如若转载,请注明出处:https://www.224m.com/208651.html

(0)
电脑教程电脑教程
穿越火线的被删角色(穿越火线手游删除角色)
上一篇 2023年1月14日 11:44
192.168.3.3-192.168.3.1登录设置.
下一篇 2023年1月14日 11:52

相关推荐

  • 路由器和网卡组合怎么设置(网卡怎么调路由器)

    在现代网络中,路由器和网卡是不可或缺的组合。路由器作为局域网的核心设备,负责将多个设备连接起来,形成一个网络。而网卡则是电脑上的一个硬件设备,用于连接局域网以及互联网。 如果将路由…

    网络 2024年12月16日
    2.5K
  • 电脑配置不够怎么办(笔记本电脑配置不够怎么办)

    7月8日,《永劫无间》即将开始官网预购不删档测试,到时候大家就可以继续游玩了。这时,可能就有小伙伴要问了《永劫无间》的配置要求是什么呢,下面小编就带大家一起来看看吧。 想要运行《永…

    2023年7月26日
    832
  • 路由器怎样设置ip及网关(路由器怎么设置ip地址)

    路由器怎样设置ip及网关 路由器在使用前需要设置ip地址和网关,以便实现网络连接和数据传输。下面是具体的设置方法: 步骤一:登录路由器管理界面 打开浏览器,输入默认网址或路由器的I…

    网络 2024年9月10日
    685
  • TP-Link TL-WR703N无线路由器无线路由模式设置上网

    TL-WR703N迷你无线路由器的无线路由模式的设置方法,在无线路由(Router)模式下,TL-WR703N就相当于一台无线路由器了,TL-WR703N上的网线接口相当于普通无线路由器上的WAN口,无线连接作为LAN连接

    2021年3月10日
    5.1K
  • 电脑操作技巧(电脑操作技巧有哪些)

    电脑是我们每天都要用到的工具,我每天都要对电脑进行开机,关机操作。但是电脑的关机方式有几种你知道吗?今天我就给大家讲一讲电脑关机的方式。 1.正常方式关机。 点击开始按钮,点击关闭…

    电脑教程 2022年11月5日
    2.4K
  • 水星mw315r路由器怎么改密码?

    请问大家:如何修改水星mw315r路由器的密码?答:用你的电脑登录到mw315r路由器的设置页面,然后就可以修改它的WiFi密码和登录密码了。请按照下面的步骤进行设置。温馨提示:如果你没有电脑,可以使用手机来设置水星mw315r路由器的密码,详细的设置步骤,请参考下面的文章:水星mw315r路由器手

    2021年6月7日
    4.6K
  • 华硕路由器浏览器设置密码(华硕路由器手机怎么设置密码)

    华硕路由器浏览器设置密码 如果你需要为你的华硕路由器设置密码,可以按照以下步骤进行操作: 打开浏览器,输入<a href=\http://192.168.1.1/\http:…

    网络 2024年9月14日
    137
  • 192.168.0.1的相关用法及路由器设置说明

    家用宽带路由器的设置。在硬件连接完成以后,我们需要有一台已经与家用宽带路由器的LAN口相连接的PC来进行具体的设置。在设置之前,我们应该确认这台机器已经装有TCP/IP网络协议,笔者使用的机器是XP操作系统,其他操作系统平台的设置基本上都差不多,下面来看看我们需"

    2021年1月24日
    13.8K
  • 网络不稳定游戏老掉线(电脑怎样设置游戏不掉线)

    朋友告急,说店里一个分路由器老是掉线,后来直接就连不上了,让我去他那里看看去,到那里我先简单看了一下它这个分路由器主线插的没错,就是说从主路由器出来的线是在WAN口上插着,那直接就…

    路由器百科 2023年2月2日
    2.6K
  • 有网登录不了路由器设置(没网怎么登录路由器)

    有网登录不了路由器设置(没网怎么登录路由器) 最近网络出现了些问题,发现需要重新设置路由器。但是在尝试登录路由器设置时,却发现无法登录。这该怎么办呢? 首先,我们需要明确一点,即登…

    网络 2024年11月10日
    274