gcc long long int 宽度与 int 相同

gcc long long int width same as int

我正在测试 gcc 8.2 版

gcc 似乎将 long long int 视为 int。有没有什么办法解决这一问题?

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

    printf("INT_MAX     :   %d\n", INT_MAX);
    printf("INT_MIN     :   %d\n", INT_MIN);
    printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
    printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
    printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
    printf("ULLONG_MAX   :   %lu\n", (unsigned long long int) ULLONG_MAX);
    printf("Big Integer   :   %lu\n", (unsigned long long int) 1234567890123456);

    printf("%d\n", sizeof(long long int));
    return 0;
}

输出:

INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_MAX    :   2147483647
LONG_MIN    :   -2147483648
UINT_MAX    :   4294967295
ULLONG_MAX   :   4294967295
Big Integer   :   1015724736
8

C:\prog_c\c_pro>gcc --version gcc (MinGW.org GCC-8.2.0-5) 8.2.0 版权所有 (C) 2018 Free Software Foundation, Inc...

您使用错误的格式说明符进行打印。

unsigned long long int 需要使用 %llu 格式说明符。您使用的是 %lu,它适用于 unsigned long int。格式说明符与类型不匹配会调用 undefined behavior.

在这种情况下可能发生的是 unsigned long long 值的前 4 个字节被读取为 unsigned long

这样打印:

printf("ULLONG_MAX   :   %llu\n", (unsigned long long int) ULLONG_MAX);
printf("Big Integer   :   %llu\n", (unsigned long long int) 1234567890123456);

您应该会看到预期的结果。

printf 需要知道 longlong long 之间的区别,那就是 %lld(有符号)或 %llu(无符号):

    printf("ULLONG_MAX  :   %llu\n", (unsigned long long int) ULLONG_MAX);
    printf("Big Integer :   %llu\n", (unsigned long long int) 1234567890123456);

这应该会如您所愿。否则,printf 只会从堆栈中获取部分位,给出你得到的错误答案。

此外,如果您打开编译器警告,它会告诉您:

long.c: In function ‘main’:
long.c:13:5: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘long long unsigned int’ [-Wformat=]
     printf("ULLONG_MAX  :   %lu\n", (unsigned long long int) ULLONG_MAX);
     ^
long.c:14:5: warning: format ‘%lu’ expects argument of type ‘long unsigned int’, but argument 2 has type ‘long long unsigned int’ [-Wformat=]
     printf("Big Integer :   %lu\n", (unsigned long long int) 1234567890123456);
     ^
long.c:16:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘long unsigned int’ [-Wformat=]

始终打开警告是一个非常非常好的主意 - 我通常使用 GCC -W -Wall - 所以它会告诉我哪里出错了。

编译器警告与 SO 类似,但没有否决票:-)