在C++中,Uint32和unsigned int有什么区别?

49

这两者是否相同?如果不相同:它们有什么区别? 如果是相同的,那么为什么需要这种类型?


https://dev59.com/pWgt5IYBdhLWcg3w0wzB - Damon
1个回答

67

uint32_t(或者是早于C++11标准的编译器所使用的名称)保证是一个32位的无符号整数;unsigned int则是编译器选择的最适合称为unsigned int的无符号整数,只要它符合标准的要求(标准要求其最小范围为0-65535)。

int一样,unsigned int通常是当前架构中易于操作的整数(通常适合于寄存器),因此在需要“正常”的快速整数时应使用它。

相反地,当您需要精确宽度的整数时,例如将其序列化到文件中或者需要该精确范围或依赖于无符号溢出恰好发生在2^32-1时,就需要使用uint32_t

例如,在16位处理器上,unsigned int通常为16位宽,而uint32_t则必须为32位宽。


顺便提一下,如@Marc Glisse所指出的,尽管unsigned int始终存在,但uint32_t不是强制性的——特定的编译器实现可能不提供它。这主要是因为并非所有平台都可以轻松地提供这样的类型(通常是具有奇怪字长的DSPs)。


5
同时,一个必须存在而另一个不必存在。 - Marc Glisse
@user1511417:询问哪个更好“先验”没有意义-它们都有各自的用途,正如答案中所概述的那样。 - Matteo Italia
uint_least32_t,然而是必须存在的。虽然不能直接访问硬件,但有助于满足最小宽度要求。 - DevSolar
1
“0-65535最小范围”有点低估了。为了支持模2^N算术,它必须具有[0, 2^N-1]范围,其中N >=16。 - MSalters
@Lorehead:嗯,unsigned long int也可以是64位的,而uint_least32_t也保证“没有比指定宽度更小的无符号整数类型至少具有指定的宽度”。此外,_t类型对其要求是明确的,而unsigned long则不是。即使我在那之前写过C,但我认为在(C99)标准中存在了16年,这几乎就是“永远”。 - DevSolar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接