我这里有一段代码:
unsigned long int a =100000;
int a =100000UL;
我怀疑上面两行是否代表同样的事情?
答案 0 :(得分:2)
算术是根据*
运算符的两个操作数完成的,它们是50000
和1024000
。其中每个都适合32位int
,因此计算完成为int
- 结果为51200000000
,但这需要至少36位来表示值,所以你有32位算术溢出,结果是未定义的行为。
算术运算完成后,int
结果将转换为64位long
- 而不是之前。
编译器警告是正确的,并且因为您调用了未定义的行为,所以打印的任何内容都是“正确的”。
要修复代码,您可以写:
#include <stdio.h>
int main(void)
{
long x = 50000L * 1024000L;
printf("%ld\n", x);
return 0;
}
严格来说,您只需要两个L
后缀中的一个,但对称性建议同时使用两者。如果您愿意,可以使用一个或两个(long)
强制转换。如果您愿意,也可以节省空间,但它们有助于代码的可读性。
答案 1 :(得分:-1)
long int和int不一定相同,但它们可能是。未签名和签名不是一回事。数值常量可以表示相同的值而不是相同的值,如100000和100000UL(前者是有符号的int,后者是无符号长)