c中的长(声明)声明

时间:2017-05-22 02:53:02

标签: c

我这里有一段代码:

unsigned long int a =100000;
int a =100000UL;

我怀疑上面两行是否代表同样的事情?

2 个答案:

答案 0 :(得分:2)

算术是根据*运算符的两个操作数完成的,它们是500001024000。其中每个都适合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,后者是无符号长)