gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 17:04:43 27 4
gpt4 key购买 nike

在 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

1065353216怎么能代表1.0f??

最佳答案

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

更具体地说,作为 32 位 float 的 1.0 变为:

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。

您可以使用 binaryconvert.comthis useful converter查看其他值。

至于为什么 127 突然在指数中表示为零:这实际上是一个非常聪明的技巧,叫做 exponent bias这使得比较浮点值变得更容易。尝试使用截然不同的值(10、100、1000...)的转换器,您会看到指数也会增加。排序也是符号位是第一个存储位的原因。

关于c - 为什么 C 代码中的 1.0f 在生成的程序集中表示为 1065353216?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24356579/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com