1929 double aa = MSGBUFSIZE*100000;
(gdb)
1930 int bb = MSGBUFSIZE*100000;
(gdb)
1931 unsigned int cc = MSGBUFSIZE*100000;
(gdb)
1932 unsigned long long dd = MSGBUFSIZE*100000;
(gdb)
1933 int64_t ee = MSGBUFSIZE*100000;
(gdb)
1934 uint64_t ff = MSGBUFSIZE*100000;
(gdb)
1937 while ((i = getopt (argc, argv, "b")) != -1)
(gdb) p aa
$1 = -1004967296
(gdb) p bb
$2 = -1004967296
(gdb) p cc
$3 = 3290000000
(gdb) p dd
$4 = 18446744072704584320
(gdb) p ee
$5 = -1004967296
(gdb) p ff
$6 = 18446744072704584320
(gdb) p sizeof(aa)
$7 = 8
(gdb) p sizeof(bb)
$8 = 4
(gdb) p sizeof(cc)
$9 = 4
(gdb) p sizeof(dd)
$10 = 8
(gdb) p sizeof(ee)
$11 = 8
(gdb) p sizeof(ff)
$12 = 8
(gdb)
其中只有cc 的值 3290000000 是正确的, 其他的值都是错误的。
为何unsigned long long 也是错误的 ? 为何 int64_t 和 uint64_t也是错误的。
我已经包含了头文件
#include <stdint.h>
#include <unistd.h>
也定义了 #define _FILE_OFFSET_BITS 64 这个测试过,结果都一样。
我编译出来的可执行文件 用 file查看也是64为的PE文件。
------解决方案--------------------------------------------------------
试试
MSGBUFSIZE*100000U
------解决方案--------------------------------------------------------
MSGBUFSIZE具体数值多少?
------解决方案--------------------------------------------------------
32900*100000 是以int来计算的,它已经溢出
把溢出的值再赋给其它类型,并做相应的转换结果当然不对啊
------解决方案--------------------------------------------------------
+1
unsigned int cc = MSGBUFSIZE*100000;其实也是溢出了的,只是把int隐式转换成unsigned int 刚好把最高的符号位当成有效位了,所以就是正确的。为什么会刚好对呢?假设MSGBUFSIZE*100000计算得到的结果是:-1004967296,用16进制表示是:0xc4196a80(这个是补码,计算机保存数据都是补码形式)。从这个16进制的表示结果就可以看书已经产生溢出了,因为两个正数相乘的最高位有进位了,本来最高位是0,现在是1了,所以出现了两个大正数计算的结果是一个负数。当将int隐式转换成unsigned int时,最高位(刚才的进位)不在被看成符号位了,所以就刚好是就算的结果。
------解决方案--------------------------------------------------------
unsigned int v = 32900*100000;//warning: overflow in implicit constant conversion
unsigned int v = 32900*100000U;//type promotion, it's fine here
------解决方案--------------------------------------------------------
只需要这个值的话u就可以了,再大就要上ll了
------解决方案--------------------------------------------------------