C:哪些数据类型大小是正确的?

问题描述 投票:1回答:1
  1. 为什么C和gdb输出的东西不一样?

  2. 而且有些数据类型大小甚至可以相等?至少是 维基百科 说这些都有不同的数值范围。

我的机器是64位的,为什么C和gdb输出的东西不一样?

#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)
$1 = 4
(gdb) p sizeof(long int)
$2 = 4
(gdb) p sizeof(long long int)
$3 = 8
c memory gdb sizeof
1个回答
2
投票

没有GDB的C代码的输出是由编译器定义的。

这个帖子可以帮助你根据你的机器弄清楚大小。

C语言中整数的大小

在64位的windows上,long int的大小是4个字节(像你这样),而在Mac上这种类型是8个字节。

如果你想在编写c代码时获得精确性,你应该使用stdint内置模块中的 "uintX_t "类型。

例如 "int8_t, uint32_t ..."

这样可以确保无论编译器或运行在什么机器上,你都能得到预期的大小。


1
投票

原生的 "main "类型的大小是依赖于编译器目标的.C标准定义了每个类型的最小尺寸,我引用维基百科的说法。

char的最小尺寸是8位,short和int的最小尺寸是16位,long的最小尺寸是32位,long long必须至少包含64位。int的类型应该是目标处理器工作效率最高的整数类型。

所以,看来gdb在这里假设的机器和你的编译器不同。你有没有把你的调试目标加载到gdb中?我希望大小能匹配。


1
投票

在64位x86 GNULinux系统上,gdb通常被配置为使用了 i386 架构(32位ABI)的默认情况。

$ gdb -q
(gdb) p sizeof(int)
$1 = 4
(gdb) p sizeof(long)
$2 = 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)
$1 = 4
(gdb) p sizeof(long)
$2 = 8
(gdb) show arch
The target architecture is set automatically (currently i386:x86-64)
© www.soinside.com 2019 - 2024. All rights reserved.