问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C语言中为何整型变量以实型变量输出为0?

发布网友 发布时间:2022-04-29 07:17

我来回答

3个回答

热心网友 时间:2022-06-21 01:41

1、整形数和浮点数在内存中的存储格式和布局不同(理解浮点数的内存布局和表示方式,请参考:http://blog.csdn.net/songjinshi/article/details/7753777)
2、printf在进行参数入栈时是根据实参的类型进行入栈,而不是根据格式化字符中指定的类型,具体入栈过程如以下所示。所以造成入栈实参的类型和实际函数使用的类型不匹配(关键是所占内存的大小不同),所以在具体的解析中就会出现如题所说的结果,因为整形的内存布局在被解析为浮点数时会非常小,因为整形本来是4个字节存储,而被解析为8个字节的浮点数,所以所得的值会非常小,正如浮点数的的表示:非规格化:当E的二进制位全部为0时,N为非规格化形式。

  注意,此时小数点左侧的隐含位为0。 为什么e会等于(1-bias)而不是(-bias),这主要是为规格化数值、非规格化数值之间的平滑过渡设计的。后文我们还会继续讨论。
  有了非规格化形式,我们就可以表示0了。把符号位S值1,其余所有位均置0后,我们得到了 -0.0; 同理,把所有位均置0,则得到 +0.0。非规格化数还有其他用途,比如表示非常接近0的小数,而且这些小数均匀地接近0,称为“逐渐下溢(graally underflow)”属性。

下面贴出两段反汇编代码,解析参数如何入栈:
printf("%f",45);
00405028 mov esi,esp
0040502A push 2Dh
0040502C push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)
00405031 call dword ptr [__imp__printf (43C124h)]
00405037 add esp,8

printf("%f",d);(d为整形变量)
00405028 mov esi,esp
0040502A mov ecx,dword ptr [d]
0040502D push ecx
0040502E push offset _ORDER_SERVER_ADDRESS-0ACh (43F2ACh)
00405033 call dword ptr [__imp__printf (43C124h)]
00405039 add esp,8
0040503C cmp esi,esp
0040503E call _RTC_CheckEsp (439760h)

double a=5,c;
float b;
int d=0x40a00000,y=6;
int *p;
char s=5;

p=&d;

b=(float)a;

printf("%f,%f,%f,%f,%f,%f,%d",b,c,(float)d,s,(float)s,y,y);
00405028 mov esi,esp
0040502A mov ecx,dword ptr [y]
0040502D push ecx
0040502E mov edx,dword ptr [y]
00405031 push edx
00405032 movsx eax,byte ptr [s]
00405036 mov dword ptr [ebp-34h],eax
00405039 fild dword ptr [ebp-34h]
0040503C sub esp,8
0040503F fstp qword ptr [esp]
00405042 movsx ecx,byte ptr [s]
00405046 push ecx
00405047 fild dword ptr [d]
0040504A sub esp,8
0040504D fstp qword ptr [esp]
00405050 sub esp,8
00405053 fld qword ptr [c]
00405056 fstp qword ptr [esp]
00405059 fld dword ptr [b]
0040505C sub esp,8
0040505F fstp qword ptr [esp]
00405062 push offset _ORDER_SERVER_ADDRESS-0C4h (43F2ACh)
00405067 call dword ptr [__imp__printf (43C124h)]
0040506D add esp,30h
00405070 cmp esi,esp
00405072 call _RTC_CheckEsp (439780h)

热心网友 时间:2022-06-21 01:41

实型变量是嘛,只听过实参和形参

热心网友 时间:2022-06-21 01:41

楼主打错了吧,把代码粘贴出来看看,直接问很难理解
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
陌陌发语音出现转码失败怎么办 女孩2010年5月10号阴历3月27早晨9点55分出生的五行缺什么 钟姓男孩名字2023年5月10日出生的 凤眼果有什么营养?凤眼果的这些营养你都知道吗? 专升本成绩多少合格 山东专升本成绩多少合格 山东2022年专升本成绩什么时候出 2024专升本成绩公布时间及入口 2023年山东专升本各专业录取分数线 什么时候出专升本成绩 山东专升本综合素质测评成绩怎么算 权臣之女,嫁给君王为妻,父亲杀死君王之后,她又是什么结局? 请索爱手机达人推荐一台索爱手机 150W的额定率功放峰值450W可以用2个30W_150W的音箱会不会很容易音箱太小容易烧坏 贝纳利502c电瓶型号规格 钱江贝纳利752S,502C和川崎Z400如何选? 贝纳利502C油箱为啥只能加17升油就满了,公开配置上写的是21升啊? 黑枸杞会吃上火吗? 我的小米手机明明设置好了来短信提示音,为何来,收到短信了,咋就提示音不响呢? 吃黑枸杞究竟会不会上火 如何吃黑枸杞才不上火 黑枸杞吃了老是上火,为什么 黑枸杞上火吗 黑枸杞吃了会上火吗,黑枸杞吃多了会上火吗 喝黑枸杞泡的水,会上火吗? 吃多了黑枸杞会上火吗 急转班夜班怎么发朋友圈 喝黑枸杞上火了怎么办 晚上一个人在工地睡觉怎么发朋友圈? 喝黑枸杞会上火吗 喝黑枸杞会上火吗? 黑枸杞上火吗? 贞观长歌安康公主最后的结局是怎样? 姻缘:秋夜雨寒结局是什么,是怎样的 女主角怎样了 历史上,朝鲜女子远嫁明朝帝王,为何结局都很悲惨,没能留下好下场? rv24yn20s电位器B502 152C阻值为多少? 求几部像《且试天下》这种类型的小说,文风轻松搞笑,最好女生也很强大的那种结局怎么样都行··谢谢 电视剧《贞观长歌》里得郑式之女郑丽婉结局是咋样的? 元朝灭亡后,上百万的蒙古女结局如何? 康明斯6l发动机参数 鲁元公主是刘邦的第一个女儿贵不可言,最后结局如何? 265/502ZR19/110 W XL汽车轮胎表示什么? 请问高手:debug如何用 还有它的参数是什么意思 求穿越小说,要女主倾国倾城武功高强,结局一女N男 求古代言情小说。类似红颜乱男女主角一开始就成亲但不爱的那种、结局要好的、有多少来多少、越多分月高 长春高速公路客服人工电话? 安徽高速公路客服电话人工服务热线 鄂尔多斯高速公路服务电话 手机怎么选车牌号码 手机选车牌号怎么选择 手机选车牌号每选一组有备选吗 手机选车牌号技巧