有一个小问题引发的一个问题

april0 2008-07-22 08:47:06
刚看到一个帖子,是这么提问的:
“我知道这个是ld的错误。我就是想知道 为什么 得0 ?谢谢。。。

#include <stdio.h>
void main(){
double a=2.0;
int k=1;

while(k <=2)
{
a=a*2.0;
k++;
}
printf("%d:%ld\n",k,a);
}

谢谢”
其中有两位网友是这么回帖的:
由于a在内存中是这样的:00 00 00 00 00 00 20 40;而%ld是整形,所以只取前四个字节00 00 00 00,所以就是0了
printf参数的问题。printf第一个参数char*型的,表明后面参数的个数和类型。参数入栈的时候是根据前面的信息分配栈单元。ld分配了一个栈单元(32位),但是你入栈的是double型,却要2个栈单元,在打印输出的时候,又是只抛出32位。就像6楼说的,那个栈单元是0。


我个人觉得他们说的很有道理。
但按理说,a的值是8.0。在内存中为什么是00 00 00 00 00 00 20 40。我没有学过编译原理,不知道8.0为什么存储到内存中变为00 00 00 00 00 00 20 40,这其中是怎么转换的。希望知道的网友指点一下。谢谢。

...全文
81 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xlb_115 2008-07-23
  • 打赏
  • 举报
回复
那位网友说得是对的。
double类型的数据占8个字节,00 00 00 00 00 00 20 40是内存查看器中的写法,是16进制的写法。
%ld是占4字节,对象虽然是a,但只取其前4字节。
april0 2008-07-23
  • 打赏
  • 举报
回复
那它存储到内存中到底是怎么表示的呢?
[Quote=引用 1 楼 yeliguo12345 的回复:]
00 00 00 00 00 00 20 40没看过这种写法
[/Quote]
taodm 2008-07-23
  • 打赏
  • 举报
回复
自己google “浮点数的内存表示”、“IEEE浮点标准”等等
vtkarl 2008-07-23
  • 打赏
  • 举报
回复
00 00 00 00 00 00 20 40是内存查看器中的写法

貌似可以他这样的说法。。其他应该是对的。。
april0 2008-07-23
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 xlb_115 的回复:]
那位网友说得是对的。
double类型的数据占8个字节,00 00 00 00 00 00 20 40是内存查看器中的写法,是16进制的写法。
%ld是占4字节,对象虽然是a,但只取其前4字节。
[/Quote]
请问内存查看器中为什么是这么写的,怎么转换啊?
yeliguo12345 2008-07-22
  • 打赏
  • 举报
回复
00 00 00 00 00 00 20 40没看过这种写法

24,855

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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