为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216?

2023-12-26

在 C 中我有这个代码块:

if(x==1){
    a[j][i]=1;
}
else{
    a[j][i]=0;
}

a是一个浮点值矩阵,如果我尝试以 nasm 语法查看此代码的编译程序集

线a[j][i]=0;作业,以这种方式编码

dword [rsi+rdi], 0

但这条线a[j][i]=1;作业,以这种方式编码

dword [rsi+rdi], 1065353216

How can 1065353216代表一个1.0f??


Because 1065353216是 32 位浮点值 1.0 的无符号 32 位整数表示。

更具体地说,1.0 作为 32 位浮点数变为:

0....... ........ ........ ........ sign bit (zero is positive)
.0111111 1....... ........ ........ exponent (127, which means zero)
........ .0000000 00000000 00000000 mantissa (zero, no correction needed)
___________________________________
00111111 10000000 00000000 00000000 result

所以最终的结果是2^0 + 0,也就是1 + 0,也就是1。

您可以使用二进制转换网站 http://www.binaryconvert.com/ or 这个有用的转换器 http://www.h-schmidt.net/FloatConverter/IEEE754.html查看其他值。

至于为什么 127 突然意味着指数为零:这实际上是一个非常聪明的技巧,称为指数偏差 http://en.wikipedia.org/wiki/Exponent_bias这使得比较浮点值变得更容易。尝试使用截然不同的值(10、100、1000...)的转换器,您会看到指数也会增加。排序也是符号位是第一位存储的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216? 的相关文章

随机推荐