【问题标题】:How does uint32_t guarantee 32 bits?uint32_t 如何保证 32 位?
【发布时间】:2018-08-23 01:18:38
【问题描述】:

在大多数实现中,我看到uint32_t 定义为

typedef unsigned int uint32_t;

但据我了解,ints 在所有系统中都是not always guaranteed to be 4 bytes。那么如果系统有非4字节整数,uint32_t怎么保证4呢?

【问题讨论】:

  • 大概它只在int 是 4 个字节的系统上以这种方式定义。您是否查看过它在其他系统上是如何定义的?
  • 您找到特定定义的文件随您查找的特定系统一起提供。在具有不同类型大小的系统上,该文件将包含不同的定义。
  • 名字里有
  • 这是纯 C,与 C++ 无关,所以它应该被标记为 C。现在修复它为时已晚,因为一些答案涉及 C++。请看this meta post(社区wiki正在建设中,欢迎大家投稿)。

标签: c++ c int size int32


【解决方案1】:

需要一个实现来正确定义uint32_t(如果不可能,则根本不需要)。

如果unsigned int满足要求(32位宽,无填充位),实现可以定义为

typedef unsigned int uint32_t;

如果不满足,但unsigned long确实满足要求,可以定义为:

typedef unsigned long uint32_t;

如果合适的话,它可以使用不同的无符号类型。

<stdint.h> 标头必须与它所使用的编译器兼容。如果您将 <stdint.h> 标头无条件定义为 unsigned int,并将其与使 unsigned int 为 16 位的编译器一起使用,则结果将是不合格的实现。

可以通过为编译器定制头文件或编写头文件以使其适应编译器的特性来保持兼容性。

作为一名程序员,您不必担心如何保持正确性(当然好奇并没有错)。您可以依靠它正确完成 - 或者您可以向提供商投诉严重的错误。

【讨论】:

  • "或者如果合适的话,它可以使用不同的无符号类型。" ...或者可以是编译器实习生表示或其他任何东西
  • 或内置类型
【解决方案2】:

定义uint32_t 的每个 C 或 C++ 实现都以适用于该实现的方式定义它。仅当 unsigned int 满足 uint32_t 在该实现中时,它才可以使用 typedef unsigned int uint32_t;

typedef unsigned int uint32_t; 在一个 C 或 C++ 实现中出现在 <stdint.h> 中这一事实并不意味着它会出现在任何其他 C 或 C++ 实现中的<stdint.h> 中。 unsigned int 不适合 uint32_t 的实现必须提供不同的 <stdint.h><stdint.h> 是实现的一部分,并随着实现的变化而变化。

【讨论】:

    【解决方案3】:

    uint32_t 保证 32 位?

    是的。


    如果CHAR_BIT == 16uint32_t 将是 2 个“字节”。在 C 中,“字节”并不总是 8 位。

    int 的大小不是关于实现uintN_t 的主要问题。

    uintN_t (N = 8,16,32,64) 是可选的非填充类型,在系统支持时独立存在。发现它们被实现是非常普遍的,尤其是较大的。

    intN_t 同样是可选的,必须是 2 的补码。

    【讨论】:

    • 问题问如何,而不是是否。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2011-05-18
    • 1970-01-01
    • 2016-02-23
    • 2023-04-01
    • 2016-09-23
    • 1970-01-01
    相关资源
    最近更新 更多