C:哪些数据类型大小是正确的?
C: Which data type sizes are correct?
为什么 C 和 gdb 输出不同的东西?
有些数据类型的大小怎么可能相等?至少wikipedia说所有这些都有不同的取值范围。
我有一台 64 位机器。
#include <stdio.h>
int main() {
printf("int: %d, long int: %d, long long int: %d\n", sizeof(int), sizeof(long int), sizeof(long long int));
}
$ gcc -g test.c
$ ./a.out
int: 4, long int: 8, long long int: 8
$ gdb -q
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long int)
= 4
(gdb) p sizeof(long long int)
= 8
没有 GDB 的 C 代码的输出由编译器定义。
这个post可以帮助您根据您的机器确定尺寸:
Size of integer in C
在 64 位上 windows long int 的大小是 4 个字节(就像你得到的那样)
而在 Mac 这种类型是 8 个字节。
如果您在编写 C 代码时需要精确度,您应该使用 "uintX_t" 内置模块中的 stdint 类型。
例如:"int8_t, uint32_t ..."
这可以确保您获得预期的大小,而不管您 运行 使用的编译器或机器如何。
原生 "main" 类型的大小 compiler/target 依赖。
C 标准定义了每种类型的最小尺寸,我将引用维基百科:
The minimum size for char is 8 bits, the minimum size for short and int is 16 bits,
for long it is 32 bits and long long must contain at least 64 bits. The type int
should be the integer type that the target processor is most
efficiently working with.
因此,似乎 gdb 在这里假设的机器与您的编译器假设的机器不同。您甚至将调试目标加载到 gdb 中了吗?我希望尺寸能匹配。
在 64 位 x86 GNU/Linux 系统上,gdb 通常默认配置为使用 i386
架构(32 位 ABI):
$ gdb -q
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long)
= 4
(gdb) show arch
The target architecture is set automatically (currently i386)
那是在 Debian WSL 系统上。
给gdb一个目标文件后,它会适当调整:
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 2.6.32, not stripped
$ gdb -q a.out
Reading symbols from a.out...done.
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long)
= 8
(gdb) show arch
The target architecture is set automatically (currently i386:x86-64)
为什么 C 和 gdb 输出不同的东西?
有些数据类型的大小怎么可能相等?至少wikipedia说所有这些都有不同的取值范围。
我有一台 64 位机器。
#include <stdio.h>
int main() {
printf("int: %d, long int: %d, long long int: %d\n", sizeof(int), sizeof(long int), sizeof(long long int));
}
$ gcc -g test.c
$ ./a.out
int: 4, long int: 8, long long int: 8
$ gdb -q
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long int)
= 4
(gdb) p sizeof(long long int)
= 8
没有 GDB 的 C 代码的输出由编译器定义。
这个post可以帮助您根据您的机器确定尺寸:
Size of integer in C
在 64 位上 windows long int 的大小是 4 个字节(就像你得到的那样) 而在 Mac 这种类型是 8 个字节。
如果您在编写 C 代码时需要精确度,您应该使用 "uintX_t" 内置模块中的 stdint 类型。
例如:"int8_t, uint32_t ..."
这可以确保您获得预期的大小,而不管您 运行 使用的编译器或机器如何。
原生 "main" 类型的大小 compiler/target 依赖。 C 标准定义了每种类型的最小尺寸,我将引用维基百科:
The minimum size for char is 8 bits, the minimum size for short and int is 16 bits, for long it is 32 bits and long long must contain at least 64 bits. The type int should be the integer type that the target processor is most efficiently working with.
因此,似乎 gdb 在这里假设的机器与您的编译器假设的机器不同。您甚至将调试目标加载到 gdb 中了吗?我希望尺寸能匹配。
在 64 位 x86 GNU/Linux 系统上,gdb 通常默认配置为使用 i386
架构(32 位 ABI):
$ gdb -q
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long)
= 4
(gdb) show arch
The target architecture is set automatically (currently i386)
那是在 Debian WSL 系统上。
给gdb一个目标文件后,它会适当调整:
$ file a.out
a.out: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV),
dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2,
for GNU/Linux 2.6.32, not stripped
$ gdb -q a.out
Reading symbols from a.out...done.
(gdb) p sizeof(int)
= 4
(gdb) p sizeof(long)
= 8
(gdb) show arch
The target architecture is set automatically (currently i386:x86-64)