鱼C论坛

 找回密码
 立即注册
查看: 1694|回复: 10

[已解决]%p打印地址出来0x后面有些是8位,有些是12位是什么原因

[复制链接]
发表于 2020-2-4 17:17:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
参考  带你学C带你飞第22课

printf(“%p”,&a);

打印a变量的地址,视频里输出是0x12345678(数字不一样,我就是想表达是8位),
我想了一下,16进制位,1个位置代表4个二进制位,8个就是32个二进制位,系统是32位的原因吧。

然后我自己的电脑,我也是用linux系统,版本是centos6.8,记得是64位的,装的挺久了,
同样打印输出,0x123456781234,后面跟着12位。我又想了一下,不对阿,64位不是应该有16个数字吗。

问题:地址长度和什么原因有关
最佳答案
2020-2-4 19:49:51
a86116403 发表于 2020-2-4 19:40
问我吗,我不知道锕,大哥请解答

不管是十六进制还是十进制,在一个数的前面加0是不会改变这个数的大小的
例如
100
0000100
上面两个数都是相同的
因此
0x1234
0x00001234

这两个数的大小是一样的

0x123456789abc
0x000123456789abc
这两个数是一样的
或者写成128位的形式
0x0000000000000000000123456789abc


0x123456789abc
这个数有12个数字,可以肯定这个数不是一个32位的数,但是并不能说这个数是64位的,因为还有可能是128位的,或者256位的,不过就是前面多加几个0而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-4 18:19:27 | 显示全部楼层
0x1234
0x00001234

提问,上面两个输出有区别吗?有什么区别?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 19:40:55 | 显示全部楼层

问我吗,我不知道锕,大哥请解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 19:49:51 | 显示全部楼层    本楼为最佳答案   
a86116403 发表于 2020-2-4 19:40
问我吗,我不知道锕,大哥请解答

不管是十六进制还是十进制,在一个数的前面加0是不会改变这个数的大小的
例如
100
0000100
上面两个数都是相同的
因此
0x1234
0x00001234

这两个数的大小是一样的

0x123456789abc
0x000123456789abc
这两个数是一样的
或者写成128位的形式
0x0000000000000000000123456789abc


0x123456789abc
这个数有12个数字,可以肯定这个数不是一个32位的数,但是并不能说这个数是64位的,因为还有可能是128位的,或者256位的,不过就是前面多加几个0而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-4 19:52:48 | 显示全部楼层
你的系统是64位的,输出的这个地址是64位的,有16个数字组成
例如有一个64位的地址
0x0000000000000000   没错,这个64位的地址表示的就是地址0
0x0000000000000004   表示第4个内存单元
前面的那么多0可以省略
0x4
0x04
都表示第4个内存单元
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 23:23:19 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-2-4 19:49
不管是十六进制还是十进制,在一个数的前面加0是不会改变这个数的大小的
例如
100

你的意思是前面是0的被省略掉了是吧,64位操作系统按理说是应该显示16位16进制数,只是这个变量存的地址刚好前4位是0所以省略掉了是吧。一个内存地址大小是一个字节这个我知道的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-4 23:25:57 From FishC Mobile | 显示全部楼层
人造人 发表于 2020-2-4 19:52
你的系统是64位的,输出的这个地址是64位的,有16个数字组成
例如有一个64位的地址
0x0000000000000000   ...

就是说比如一个变量存在0x0000123456789abc,打印出来的地址可能是0x123456789abc,是这个意思吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 00:09:46 | 显示全部楼层
a86116403 发表于 2020-2-4 23:23
你的意思是前面是0的被省略掉了是吧,64位操作系统按理说是应该显示16位16进制数,只是这个变量存的地址 ...

对,前面的4个0省略了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 15:54:01 | 显示全部楼层
人造人 发表于 2020-2-5 00:09
对,前面的4个0省略了

大哥再请教一下啊,32位系统内存范围是0x0~0xffffffff,然后64位系统内存范围是0x0~0xffffffffffffffff,内存是向硬盘里去读内容,所以硬件都一样的情况下,64位比32位系统读取速度要快是吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-5 16:10:00 | 显示全部楼层
a86116403 发表于 2020-2-5 15:54
大哥再请教一下啊,32位系统内存范围是0x0~0xffffffff,然后64位系统内存范围是0x0~0xffffffffffffffff, ...

这可不一定,读取速度受好多因数的影响
首先就是你写的程序,如果你的程序是32位的,那速度肯定没有64位的程序快
如果外围硬件没有提供64位的数据通道,那就算是你的程序是64位的也快不了
有好多因数影响速度,不能一概而论
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-5 17:36:08 | 显示全部楼层
人造人 发表于 2020-2-5 16:10
这可不一定,读取速度受好多因数的影响
首先就是你写的程序,如果你的程序是32位的,那速度肯定没有64位 ...

谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-16 05:15

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表