C中隐式转换为double

oxalkeyp  于 2023-05-28  发布在  其他
关注(0)|答案(1)|浏览(142)

我正在尝试理解C中的隐式转换。我有以下C代码:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int a = -6 ;
    size_t b = 100 ;
    int result = a*b ; /* a is converted to size_t,
    multiply two unsigned ints and cast the result to int
    */
    double dresult = a*b ;
    printf("Result : %d \n",result); //         Output  Result : -600 
    printf("Double Result : %f \n",dresult); // Output  Double Result : 18446744073709551616.000000 
    return 0;
}

从我对cppreference的理解来看,result应该是一些垃圾值(当转换为double时打印出来的),但为什么它会给予我正确的值?

bttbmeg0

bttbmeg01#

未定义的行为并不意味着你会得到垃圾,只是任何事情都可能发生。即使是明智的。问题是,你不能指望它是明智的。
你可能有一个小端二进制补码机器,即使你提供了太多,堆栈也会被正确清理。
事实上,它是一个二进制补码机器,这意味着有符号数的位表示和它的无符号提升没有区别。
-6是FA FF FF…
-6\f25 32- 6位无符号是-6\f25 4,294,967,290 - 6,或-6\f25 FA FF FF...
-6\f25 64- 6位无符号是-6\f25 18,446,744,073,709,551,610 - 6,或-6\f25 FA FF FF...
如果数字对于int来说足够小,那么它是一个小端机器的事实意味着它只是忽略了尾随的FF字节,这对数字没有影响。
乘法的结果是A8 FD FF FF…
A8 FD FF FF...被视为有符号的数字是-600。

相关问题