无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?

unsigned int vs unsigned long both are 32bit but I can't intermix them without casting... why?

本文关键字:无符号 转换 情况下 混合 为什么 两者都 int      更新时间:2023-10-16

我的电脑显示sizeofunsigned longunsigned int相同。

但是,当将参数传递给方法时...更具体地说是指针...我必须将unsigned int重新塑造为unsigned long. 否则生成错误为Compiler Error C2664":'function' : cannot convert argument n from 'type1' to 'type2'

为什么?

就编译器而言,它们是完全不相关的类型。传递除参数期望的指针之外的任何类型的指针都是错误。

但是,即使编译器认识到这种类型的指针强制转换是可能的并为您执行此操作,这也是为什么这会很糟糕的原因......

C++已经存在了足够长的时间,以至于随着新 CPU 架构的出现和消失,intlong都改变了大小。intlong的大小取决于您正在使用的编译器和平台,因此,如果它们的大小不同,int*转换为long*(反之亦然)可能会导致您遇到各种问题。

根据C++标准,这些是跨各种平台的intlong的大小:

type | C++ standard | LP32 | ILP32 | LLP64 | LP64
-------------------------------------------------
int  | at least 16  | 16   | 32    | 32    | 32      bits
long | at least 32  | 32   | 32    | 32    | 64      bits

只有使用 ILP32 和 LLP64,您才能安全地假设intlong的大小相同,但在编译器中支持该假设将允许您编写无法在其他平台上安全编译或运行的代码。

最后,如果您需要保证整数的大小在所有平台上都相同,那么您可以#include <cstdint>并使用诸如int16_tuint16_tint32_t等类型。这些固定宽度的整数可用于支持 C++11 及更高版本的编译器。