我正在使用math.h库,当我运行下面的代码时,我得到g ++编译错误,告诉我“警告:隐式常量转换溢出”多行。但是,如果我仍然运行可执行文件,它会为我提供合理的数字(尽管由于某种原因,Ints和longs的最大值返回相同)。但是如果我使用cmath库,所有签名的数据类型都会给我负值,而unsigned则返回0 ....
C ++:
/* Calculating data type sizes directly */
/* Shorts - 2 bytes = 2*8(bits/byte) = 16 bits */
smallest_short = -(pow(2, 15));
largest_short = pow(2,15); // LINE 141
us_smallest_short = 0;
us_largest_short = pow(2, 16); // LINE 143
/* Ints - 4 bytes = 4*8(bits/byte) = 32 bits */
smallest_int = -(pow(2, 31));
largest_int = pow(2, 31); // LINE 147
us_smallest_int = 0
us_largest_int = pow(2, 32); // LINE 149
/* Long - 8 bytes = 8*8(bits/byte) = 64 bits */
smallest_long = -(pow(2, 63));
largest_long = pow(2, 63); // LINE 153
us_smallest_long = 0;
us_largest_long = pow(2, 64); // LINE 155
g ++编译错误:
datatypesexp.cpp: In function âint main()â:
datatypesexp.cpp:141: warning: overflow in implicit constant conversion
datatypesexp.cpp:143: warning: overflow in implicit constant conversion
datatypesexp.cpp:147: warning: overflow in implicit constant conversion
datatypesexp.cpp:149: warning: overflow in implicit constant conversion
datatypesexp.cpp:153: warning: overflow in implicit constant conversion
datatypesexp.cpp:155: warning: overflow in implicit constant conversion
我应该坚持使用math.h吗?如何解决警告?
另外, 如果我使用math.h运行exec,忽略警告,我签名的“最大的int”和最大的长“都返回2147483647。
虽然没有签名,但他们都返回4294967295.但是多头应该会返回更大的价值......
我该如何解决这个问题?
答案 0 :(得分:0)
正值溢出,因为在刻度的那一侧有零容纳,留下一个值更少。例如,pow(2, 31)
为2,147,483,648(在赋值为double之前表示),但在这种情况下,最大有符号整数为2,147,483,647。
答案 1 :(得分:0)
无符号n位变量可以容纳的最大值是2 ^ n-1,而不是2 ^ n。