变量的值为整数和双精度
Value of variable as integer and as double
所以我有一个值为 0xfccd11c0 的无符号整数 Q。
当我用printf("%i", Q);
打印它时,我得到 -53669440这是0xfccd11c0的有符号整数表示形式,所以我得到了它。
但是当我用printf("%i", (double)Q);
打印它时,我得到了939524096。我确实知道为了打印双精度值,您需要使用 %f
作为字符串格式,但是,转换为双精度值时会发生什么导致打印该值?
Q 是4241297856
(双)Q 具有 64 位 IEEE-754 表示0x41EF99A238000000
在小端序中,这个较低的 4 个字节占用的空间与 (int)Q 相同。
0x38000000 939524096
方便的在线转换器:http://babbage.cs.qc.edu/courses/cs341/IEEE-754.html
在函数中使用错误的格式说明符(如printf
)会触发未定义的行为;在这种情况下,任何事情都可能发生。
在这里,Q 被显式转换为(由您)一个新的内存对象,我们称之为 Q_dbl
。它被传递给 printf
函数,但正如你指定%i
参数一样,此内存块被解释为整数。这是在低级别上发生的事情的想法。
unsigned int Q = 0xfccd11c0;
printf("%i", Q);
printf("%i", (double)Q);
auto Q_dbl = (double)Q;
printf("%f", Q_dbl);
printf("%i", Q_dbl);
代码未经过测试。
您可以轻松模拟使用此代码发生的情况:
unsigned int Q = 0xfccd11c0;
double dQ = (double)Q;
int *x = (int*)(&dQ);
*x 现在等于 939524096。
请看我对类似问题的回答:函数 printf 在 C 中是如何工作的?基本上,C 编译器在两组不同的注册表上执行整数和浮点运算,printf
从与格式字符串对应的注册表中提取它的参数。这是导致printf
在格式字符串和传递的参数不匹配时出现奇怪行为的原因之一。
请注意,当编译器优化将参数放置在可用注册表中而不是将它们放在堆栈中时,参数数量减少就会发生这种情况。
- 我可以信任表示整数的浮点或双精度来保持精度吗
- C 字符串返回字符串的整数/双精度/长整型值
- 如何防止双精度值到整数的隐式转换
- 野牛/flex:计算器将双精度值解释为整数,所以我添加了 YYSTYPE 双精度 #define 但我有多个编译错误
- 为什么输出是整数而不是双精度?
- 从字符串转换为双精度和整数 - C++
- 从双精度转换为整数的显式类型是否始终检查整数溢出?
- C++,遇到将双精度转换为整数的问题
- 用双精度除以整数
- 使用整数初始化列表初始化长双精度的向量
- 如何判断 c++ 向量中的值类型(整数或双精度)?
- 了解双精度转换与整数转换中的整数与截断关系
- 为什么使用 int64_t 会产生错误的结果,而双精度则按预期进行简单的整数乘法
- 将双精度与整数进行比较
- 64 位整数到双精度冲突
- 在编译时将整数和分数部分宏组合成一个新的宏或双精度
- 不确定输出双精度或整数的代码行
- 双精度/整数模板函数的向量
- 如何通过 JNI 设置 java 类的双精度/整数类型的值
- 将输入验证为双精度/整数的函数