数值由unsigned long 转换为unsigned long long前后,printf输出不一致

itzyx 2017-02-17 03:50:16
32位的arm平台,部分代码如下:
unsigned long a = 0x200000;
printf("0x%08lx\n", a);
printf("0x%016llx\n", (unsigned long long)a);


uboot下,输出结果分别为(多次运行一直为此):
0x00200000
0x00200000800740000

启动内核,测试结果输出分别为:
0x00200000
0x0000000000200000

编译内核和uboot的gcc一致,为何uboot下32位unsigned转换为64位,输出出现错误?

...全文
974 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
常书 2017-09-07
  • 打赏
  • 举报
回复
引用 2 楼 q3733353520 的回复:
因为你定义并且给a赋值的时候只是改变了已a为首地址的32位的内存地址的值,而以long long输出的时候是输出以a为首地址64位的内存的值,那么这后面的32位的值是不确定的。(如果系统是32位的话) 32位系统 long 32 long long 64 64位系统 long 64 long long 64
类型转换应该是在赋值时发生作用的吧,不然按照你的理论所有类型转换都该出错了
常书 2017-09-07
  • 打赏
  • 举报
回复
怀疑U-BOOT的printf的驱动不支持输出64位数据
  • 打赏
  • 举报
回复
引用 5 楼 r_Jimy 的回复:
[quote=引用 2 楼 q3733353520 的回复:] 因为你定义并且给a赋值的时候只是改变了已a为首地址的32位的内存地址的值,而以long long输出的时候是输出以a为首地址64位的内存的值,那么这后面的32位的值是不确定的。(如果系统是32位的话) 32位系统 long 32 long long 64 64位系统 long 64 long long 64
类型转换应该是在赋值时发生作用的吧,不然按照你的理论所有类型转换都该出错了[/quote] 不知所谓
Hello Worm 2017-09-06
  • 打赏
  • 举报
回复
会不会是代码不同导致的优化结果不同啊,在u-boot中,因为没有实际的操作,编译器可能会将其优化为一个常量?
  • 打赏
  • 举报
回复
因为你定义并且给a赋值的时候只是改变了已a为首地址的32位的内存地址的值,而以long long输出的时候是输出以a为首地址64位的内存的值,那么这后面的32位的值是不确定的。(如果系统是32位的话) 32位系统 long 32 long long 64 64位系统 long 64 long long 64
bigPillow 2017-07-31
  • 打赏
  • 举报
回复
是不是在uboot下,你强制转换后输出,会输出内存后面8个字节的内容。

4,436

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 内核源代码研究区
社区管理员
  • 内核源代码研究区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧