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

#include <stdio.h>static union {int i;char a[2];
} abc;int main() {abc.a[0] = 10; // 低abc.a[1] = 1; //高printf("%d\n", abc.i); //266  10areturn 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 000010100x601039  00000000 00000000 00000010 00000001

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

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

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

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

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

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

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

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

相关工具

http://tool.lu/hexconvert/

内存地址中的16进制最小单位是1bit,1Byte?相关推荐

  1. ip地址转换成16进制long

    <span style="font-size:18px;">public class IpUtil {/*** ip地址转换成16进制long* @param ipSt ...

  2. 用Matlab把 .txt文件中的16进制数据转换成2进制数据

    问题描述 使用Matlab将.txt文本文件里面存放的16进制数据转换成2进制数据,放入一个新的.txt文件中.直接附代码解释,第一次发文章,仅为了练习使用和记录. clear; clc; fid = ...

  3. MD5中使用16进制

    MD5中使用16进制消息摘要 分类: java_secruity2012-12-28 13:11 719人阅读 

  4. EXCEL中实现16进制MAC的下拉

    一般我们都只会EXCEL进行10进制的下拉自动增长,但是如果是16进制数,如何进行下拉呢? EXCEL截图: 计算公式为: =REPT(0,$C$3-LEN($B$3))&$B$3&R ...

  5. MD5中使用16进制消息摘要

    由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题. 但,二进制数太长了.比如int 类型占用4个字节,32位.比如100,用int类型的二进制数表达将是: ...

  6. Lua中的16进制,2进制,10进制转换

    Lua中的数据转换 10进制number转二进制字符串(0~255) function _byte2bin(n)local t = {}for i=7,0,-1 dot[#t+1] = math.fl ...

  7. Java十六进制码的字符_【重点】java中 转16进制字符串 hex

    方法3: BigInteger bigInteger = new BigInteger(1,bytes); String string = bigInteger.toString(16);//转换成1 ...

  8. hexde php_怎样在PHP中把16进制HEX数据转换为2进制数据呢?

    展开全部 十六进制62616964757a686964616fe78988e69d8331333337623531转为二进制有两种理解方法,第一是十六进制字符串转二进制字符串,第二是十六进制数转二进制 ...

  9. shell 中转换16进制10进制

    2012年10月10日 17:28:55 帝都码农 阅读数 12150 标签: shell 更多 个人分类: shell 一.16进制转换成10进制 printf %d 0xF 15 或者 echo ...

最新文章

  1. Java NIO系列教程(九) ServerSocketChannel
  2. WPF中的动画——(六)演示图板
  3. Spring Security 实战干货:路径Uri中的 Ant 风格
  4. JS笔记:检测客户端(引擎、浏览器、平台、操作系统)
  5. android sqlite存储数据,Android之SQLite数据存储
  6. rsa java模数_RSA公私钥获取模数和质数
  7. 二维数组的遍历之查漏补缺
  8. axios+vue+springboot完成批量删除
  9. jquery相对定位(包含find的使用 find相当于后代选择器)$(选择器1,选择器2)
  10. Android开发笔记(一百零四)消息推送SDK
  11. 谁给讲讲语音识别中的CTC方法的基本原理?
  12. 水经注下载地图,导出arcgis瓦片,然后通过geoserver+geowebcache发布地图
  13. IBM和DoE推出世界上最快的超级计算机
  14. 深度学习C++代码配套教程(1. 总述)
  15. 小黄鸡 php,Simsimi (小黄鸡) API接口(PHP)公布,小黄鸡API接口非官方PHP版本来啦...
  16. 数字逻辑——七段数码管
  17. 2018-11高级软考试题考查知识点总结(试题1-20)
  18. 1375 灯泡开关 III
  19. 如何制作GHOST系统安装盘?
  20. C++第5周任务1-4使用默认参数的构造函数,不给定实参时,默认边长为1

热门文章

  1. 摄影口诀--针对不同情景
  2. 内核区间树的使用Demo
  3. Android-VideoView启动页视频,8.0崩溃解决
  4. [转载]一个程序员心态决定成败
  5. 递归计算过程与迭代计算过程
  6. Jenkins搭建Maven项目集成开发环境(源码库 Gitlab)
  7. service mesh解决的几个问题
  8. 骑友,怎么挑选适合自己的赛事
  9. 一个汉字笔画库 hanzi-writer 的小应用
  10. Intriguing properties of neural networks