首页 > 编程知识 正文

通常以十六进制数表示内存的地址,则二进制数,若内存储器的容量为1MB,则末地址的十六进制表示为

时间:2023-05-04 08:43:02 阅读:195431 作者:1319

在研究 union的时候遇到一个题目,是关于大小端的问题,从而牵扯出了探索内存地址的问题

#include <stdio.h>static union { int i; char a[2];} abc;int main() { abc.a[0] = 10; // 低 abc.a[1] = 1; //高 printf("%dn", abc.i); //266 10a return 0;}

一般机器为小端,所以当小端的时候这里的结果为266.

为什么那?

首先这里是union共用体,所以大小为 sizeof(int).
比如地址有4个编号,1,2,3,4 分别表示低->高, 由于这里是小端,所以1->10(a),2->1(1),3->0(0),4->0(0) 括号内的为16进制

整体则为: 0x0000010a

自己也就是在 0x0000010a 上面迷糊,为什么不是0x1a 那?

这里如果要是知道16进制每两位为一个字节, 就很简单了.比如说上面4个编号,正好对应那4字节空间,每个字节空间依次对应0x0000010a 中的2位,也就是第一个字节对应0a,第二个字节对应01,依次类推.

探索

为什么内存地址中的16进制最小单位是1bit,1Byte?

通过gdb调试可以看到以下结果:

0x601038 00000000 00000010 00000001 00001010 0x601039 00000000 00000000 00000010 00000001

可以知道 内存地址 从 0x601038 到 0x601039 之间移动了1,但是二进制却8位,我们知道8bit = 1Byte,所以,内存地址的16进制最小单位为1Byte,而不是bit

为什么16进制每两位为一个字节?

通过gdb调试可以看到以下结果:

(gdb) x/x 0x6010380x601038 <_ZL3abc>: 0x00 02 01 0a(gdb) x/x 0x6010390x601039 <_ZL3abc+1>: 0x00 00 02 01

通过第一个问题,我们已经知道了 内存地址中的16进制最小单位是 Byte 而不是 bit,
所以这里的16进制 0x00 02 01 0a 和 0x00 00 02 01 正好移动了2个字符,也就是 0a,所以可以得出 数据的16进制没两位字符为一个字节.

什么叫数据的16进制那,比如

10进制 | 16进制 | 2进制
131338 | 0x0002010a | 1000000001 00001010
513 | 0x000201 | 1000000001

将一个10进制,转化为16进制数据之后的字符.如果是字符

相关工具

http://tool.lu/hexconvert/

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。