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
需要知道 long
和 long 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 类似,但没有否决票:-)
我正在测试 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
需要知道 long
和 long 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 类似,但没有否决票:-)