我在msdev 2010中看到了__int64类型的一些奇怪行为。有谁能告诉我发生了什么? 我想这里有2个问题,首先是如何显示64位整数,其次是行为 – 即为什么它看起来像__int64实际上是32位int …
#include int main() { int vl_idx; unsigned __int64 vl_64; unsigned __int64 vl_64_test; for (vl_idx = 0; vl_idx < 64; vl_idx++) { vl_64 = 1 << vl_idx; printf ("vl_64 (%d) = %I64un", vl_idx, vl_64); printf ("vl_64 (%d) = %llun", vl_idx, vl_64); printf ("vl_64 (%d) = %lun", vl_idx, vl_64); } vl_64_test = 1 < vl_64_test) printf ("greatern"); if (vl_64 == vl_64_test) printf ("equaln"); if (vl_64 < vl_64_test) printf ("lessn"); return 0; }
输出与前30次迭代的预期一致:
vl_64 (0) = 1 vl_64 (0) = 1 vl_64 (0) = 1 vl_64 (1) = 2 vl_64 (1) = 2 vl_64 (1) = 2 ... vl_64 (30) = 1073741824 vl_64 (30) = 1073741824 vl_64 (30) = 1073741824 vl_64 (31) = 18446744071562067968 vl_64 (31) = 18446744071562067968 vl_64 (31) = 2147483648 vl_64 (32) = 1 vl_64 (32) = 1 vl_64 (32) = 1 vl_64 (33) = 2 vl_64 (33) = 2 vl_64 (33) = 2 ... vl_64 (62) = 1073741824 vl_64 (62) = 1073741824 vl_64 (62) = 1073741824 vl_64 (63) = 18446744071562067968 vl_64 (63) = 18446744071562067968 vl_64 (63) = 2147483648 equal
但事情呢?溢出? 在第32次迭代。 这可能只是一个显示问题,但最后的比较表明不是这样。 这是使用msdev 2010 cl(64位版本)编译并在64位Windows操作系统(64位CPU)上运行。 关于为什么比较表明1 << 31 == 1 << 63?
谢谢你的任何建议,
吉姆
在处理比int
更宽的事情时,你需要小心整数文字,例如你需要改变:
vl_64 = 1 << vl_idx;
至:
vl_64 = 1LLU << vl_idx;
否则,在隐式转换为无符号64位结果之前,右侧将首先计算为int
表达式。
以上就是c/c++开发分享printf 64位类型说明符问题相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/541861.html