uint32_t如何保证 32 位?
How does uint32_t guarantee 32 bits?
在大多数实现中,我看到uint32_t
定义为
typedef unsigned int uint32_t;
但据我了解ints
并不总是保证在所有系统中都是 4 个字节。那么,如果系统有非 4 字节整数,uint32_t
如何保证 4 字节整数呢?
需要实现来正确定义uint32_t
(如果不可能,则根本不定义(。
如果unsigned int
满足要求(32 位宽,无填充位(,则实现可以将其定义为
typedef unsigned int uint32_t;
如果不符合,但unsigned long
确实满足要求,则可以将其定义为:
typedef unsigned long uint32_t;
或者,如果合适,它可以使用不同的无符号类型。
<stdint.h>
标头必须与使用它的编译器兼容。如果你采用一个无条件地将uint32_t
定义为unsigned int
的<stdint.h>
标头,并将其与unsigned int
16 位的编译器一起使用,结果将是不符合的实现。
可以通过为编译器定制标头来维护兼容性,也可以通过编写标头使其适应编译器的特征来维护兼容性。
作为一名程序员,你不必担心如何保持正确性(当然,保持好奇心并没有错(。您可以依靠它的正确完成 - 或者您可以向提供商投诉严重的错误。
定义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>
是实现的一部分,并在实现更改时更改。
uint32_t
保证32位?
是的。
如果CHAR_BIT == 16
,uint32_t
将是 2 个"字节"。 "字节"在 C 中并不总是 8 位。
int
的大小不是关于实施uintN_t
的主要问题。
uintN_t
(N = 8,16,32,64( 是可选的非填充类型,当系统可以支持它们时,它们独立存在。 发现它们已实现是极其普遍的,尤其是较大的实现。
intN_t
同样是可选的,必须是 2 的补码。
- 与互斥锁相比,旋转锁可以保证上下文切换
- 函数何时会在c++中包含stack_Unwind_Resume调用
- Python中的for循环与C++有何不同
- 原子读取是否保证读取最新值
- C++:当所有条目都保证是唯一时,替代 std::map
- '[](std::list& list)<int>{return std::move(list)}(list)' 是否保证将 'list' 留空?
- "std::list::splice(std::const_iterator pos, std::list&& other)"是否保证将"其他"留空?
- 在C++中释放内存期间,迭代器与指针有何不同
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- C++std::atomic在程序员级别保证了什么
- CUDA三角函数中的数学保证
- 标准是否保证无捕获的 lambda 为空?
- 是否可以保证按字节的零 int 是零的表示形式?
- 有没有办法保证析构函数的相对顺序?
- 单行函数模板 c++ 的内联性保证
- C++易失性:保证 32 位访问?
- 迭代器在递增和递减时是否保证会变异?
- 标准对此指向成员函数类型模板参数有何说明?是我的代码有误,还是 MSVS 16.6 有问题?
- std::元组分配和复制/移动异常保证