字符数据类型在32位和64位C中的存储或表示方式有什么区别?

字符数据类型在32位和64位C中的存储或表示方式有什么区别?,c,types,32bit-64bit,C,Types,32bit 64bit,字符数据类型在32位和64位C中的存储或表示方式有什么区别?没有区别。 一个字符占用一个字节。 一个字节有字符位 #include <limits.h> #include <stdio.h> int main(void) { printf("a char occupies 1 byte of %d bits.\n", CHAR_BIT); return 0; } #包括 #包括 内部主(空){ printf(“一个字符占用%d位的1字节。\n”,字符\

字符数据类型在32位和64位C中的存储或表示方式有什么区别?

没有区别。
一个字符占用一个字节。
一个字节有字符位

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

int main(void) {
    printf("a char occupies 1 byte of %d bits.\n", CHAR_BIT);
    return 0;
}
#包括
#包括
内部主(空){
printf(“一个字符占用%d位的1字节。\n”,字符\u位);
返回0;
}

没有区别。
一个字符占用一个字节。
一个字节有字符位

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

int main(void) {
    printf("a char occupies 1 byte of %d bits.\n", CHAR_BIT);
    return 0;
}
#包括
#包括
内部主(空){
printf(“一个字符占用%d位的1字节。\n”,字符\u位);
返回0;
}

一个可能的区别是字符可能在64位而不是32位边界上对齐

struct {
  char a;
  char b;
}
32位可能占用2*4字节,64位可能占用2*8字节


编辑-实际上不会。任何理智的编译器都会在字节边界上重新打包一个只有字符的结构。但是,如果您添加了“长c;”最终,任何事情都有可能发生。这就是为什么a)有sizeof()和b)在c中使用手动指针时要小心。

一个可能的区别是字符可能在64位边界上对齐,而不是在32位边界上对齐

struct {
  char a;
  char b;
}
32位可能占用2*4字节,64位可能占用2*8字节


编辑-实际上不会。任何理智的编译器都会在字节边界上重新打包一个只有字符的结构。但是,如果您添加了“长c;”最终,任何事情都有可能发生。这就是为什么a)有sizeof()和b)在c中使用手动指针时要小心。

我认为char保证至少有8位宽。如果编译器愿意,它可以选择使用8位以上。理论上,64位x86编译器可以选择与32位x86编译器不同的表示形式。我在某个地方读到过,虽然这是目的,但保留相同的表示形式。但是当相同的代码以64位或32位编译时,其存储方式可能会导致问题。这就是我现在面临的问题,我如何确保在一般情况下正确处理大小调整(例如,malloc(sizeof(char*)*5))以始终工作(即,128位及以上的未来验证)。@pxl
sizeof(char)
始终为1
sizeof(char*)
是一个完全不同的野兽。感谢大家的投入。现在一切都清楚多了。安德鲁·班布里奇——不,一个字符几乎总是8位。指向字符的指针可以是32位或64位,不同的字符变量可以对齐,以在32位、64位或128位内存边界上开始。我认为字符保证至少有8位宽。如果编译器愿意,它可以选择使用8位以上。理论上,64位x86编译器可以选择与32位x86编译器不同的表示形式。我在某个地方读到过,虽然这是目的,但保留相同的表示形式。但是当相同的代码以64位或32位编译时,其存储方式可能会导致问题。这就是我现在面临的问题,我如何确保在一般情况下正确处理大小调整(例如,malloc(sizeof(char*)*5))以始终工作(即,128位及以上的未来验证)。@pxl
sizeof(char)
始终为1
sizeof(char*)
是一个完全不同的野兽。感谢大家的投入。现在一切都清楚多了。安德鲁·班布里奇——不,一个字符几乎总是8位。指向字符的指针可以是32位或64位,不同的字符变量可以对齐,从32位、64位或128位内存边界开始。我怎么确定?如果我不能确定,您将如何处理它,以确保相同的代码在32位和64位体系结构中都能按预期编译和工作?除非您故意乱搞内存,否则这不重要。您可以在运行时检查结构的大小,但对齐通常是编译器的一个选项,因为如果检查了,那么C样式的字符串将是巨大的。数组必须遵守与结构相同的类型对齐要求。我甚至不确定这是否是一个有效的实现,除非CHAR_位分别为32或64。char是一种特殊类型,您应该能够使用char访问内存中任何其他对象的字节。如果字符数组具有对齐填充,则不会出现这种情况。结构和字符串在内存中的存储方式之间没有关系。否。字符从不对齐,只有更大的数据类型,如short和int,分别在16位和32位边界上对齐。我怎么确定?如果我不能确定,您将如何处理它,以确保相同的代码在32位和64位体系结构中都能按预期编译和工作?除非您故意乱搞内存,否则这不重要。您可以在运行时检查结构的大小,但对齐通常是编译器的一个选项,因为如果检查了,那么C样式的字符串将是巨大的。数组必须遵守与结构相同的类型对齐要求。我甚至不确定这是否是一个有效的实现,除非CHAR_位分别为32或64。char是一种特殊类型,您应该能够使用char访问内存中任何其他对象的字节。如果字符数组具有对齐填充,则不会出现这种情况。结构和字符串在内存中的存储方式之间没有关系。否。字符从不对齐,只有更大的数据类型(如short和int)分别在16位和32位边界上对齐。