【问题标题】:What Is the difference between how the char datatype is stored or represented in 32bit vs 64bit in C?char 数据类型在 32 位和 C 中 64 位的存储或表示方式有什么区别?
【发布时间】:2010-12-04 08:00:09
【问题描述】:

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

【问题讨论】:

    标签: c types 32bit-64bit


    【解决方案1】:

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

    #include <limits.h>
    #include <stdio.h>
    
    int main(void) {
        printf("a char occupies 1 byte of %d bits.\n", CHAR_BIT);
        return 0;
    }
    

    【讨论】:

    • 我认为 char 至少保证 8 位宽。如果需要,编译器可以选择使用超过 8 位。理论上,64 位 x86 编译器可以选择与 32 位 x86 编译器不同的表示。
    • 我在某处读到,虽然这是为了保持相同的表示。但是当相同的代码以 64 位或 32 位编译时,其存储方式可能会导致问题。这就是我现在遇到的问题,我如何确保我在一般情况下正确处理大小(例如 malloc(sizeof(char*)*5))以始终工作(即未来证明它适用于 128 位及以上)。
    • @pxl sizeof(char) 始终为 1。sizeof(char *) 是完全不同的野兽。
    • 感谢大家的意见。现在一切都变得清晰了。
    • Andrew Bainbridge - 不,char 几乎总是 8 位。指向 char 的指针可以是 32 位或 64 位,并且不同的 char 变量可以对齐以从 32,64 或 128 位内存边界开始。
    【解决方案2】:

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

    struct {
      char a;
      char b;
    }
    

    在 32 位上可能占用 2 * 4 个字节,在 64 位上可能占用 2 * 8 个字节。

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

    【讨论】:

    • “力量”让我害怕。我怎么确定?如果我不能确定,您将如何解决它,以确保相同的代码在 32 位和 64 位架构上都能按预期编译和工作?
    • 除非你故意弄乱内存,否则没关系。您可以在运行时检查结构的大小,但对齐通常是编译器选项
    • 不太可能,因为如果确实如此,那么 C 样式的字符串将是巨大的。数组必须遵守与结构相同的类型对齐要求。我什至不确定这将是一个有效的实现,除非 CHAR_BIT 分别为 32 或 64。 char 是一种特殊类型,您应该能够使用 chars 来访问内存中任何其他对象的字节。如果 char 数组具有对齐填充,则不会出现这种情况。
    • 结构和字符串在内存中的存储方式没有关系。
    • 没有。字符从不对齐,只有像 short 和 int 这样较大的数据类型在 16 个和 32 位边界上对齐。
    猜你喜欢
    • 2010-11-08
    • 2014-02-05
    • 2011-05-03
    • 1970-01-01
    • 2011-09-13
    • 2017-09-22
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    相关资源
    最近更新 更多