c++ - 在 Visual Studio C++ 调试器中查看双位模式
问题描述
我正在使用 IEEE-754 双打,我想验证不同平台之间的位模式是否匹配。出于这个原因,我想在 Visual Studio C++ 调试器中查看 double 的位模式。
我已经尝试过format specifiers,但它们似乎不允许我将 double 格式化为任何可以让我看到位模式的东西。
我最终找到的一种方法是使用 Memory View 并&x
在地址字段中输入变量 ( ) 的地址。这允许我设置例如 8 位整数十六进制显示,这给了我我需要的东西。但是有没有其他更方便的方式在调试器中以这种方式格式化双精度?
解决方案
要查看确切的二进制浮点值,您应该使用%a
/%A
将其打印为十六进制,而std::hexfloat
不是检查其位模式
printf("Hexadecimal: %a %A\n", 1.5, 1.5);
std::out << std::hexfloat << 1.5 << '\n';
但是,如果您真的需要查看实际的位模式,那么您只需要重新解释底层内存区域的类型,例如auto bits = reinterpret_cast<uint64_t*>(doubleValue)
. 您无需打开 Memory View 即可实现此目的,只需在 Watch 窗口中进行简单的转换即可。所以要分别得到double
和float
使用*(__int64*)&doubleValue,x
和的位模式*(int*)&floatValue,x
。确实会发生严格的别名,但您实际上不需要在 MSVC 调试器中关心它
注意它__int64
是 MSVC 的内置类型,因此您可能希望使用它long long
。Typedef 和宏之类uint64_t
的在观看时不起作用
或者,您可以通过使用,或转换char*
为数组并打印为数组来单独访问字节。这次不会发生严格的别名,但输出的可读性可能会降低(char*)&doubleValue, 8
(char*)&floatValue, 4
(char*)&floatingPoint, [sizeof floatingPoint]
推荐阅读
- angular - 角度 DI 跳过直到达到顶层
- python - Django generics.ListAPIView 接受 POST 方法
- php - PHPmailer:错误:您必须提供至少一个收件人电子邮件地址
- php - 登录系统中的 if() 语句无法正常工作
- python - 将订阅主题中的 MQTT 数据保存在文本文件中
- python - 数据框中所有行之间的最大元素差异
- jasper-reports - 为什么LineChart中只显示一个数据?
- azure - 如何获取 Azure EventHub 深度
- c++ - 为什么 -INT_MIN 对于 uint64_t 类型不是 2147483648
- c - while-loop 只读取文件的第一行