我正在尝试理解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时打印出来的),但为什么它会给予我正确的值?
1条答案
按热度按时间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。