无符号 int 与无符号长 两者都是 32 位,但我无法在不转换的情况下混合它们......为什么?
unsigned int vs unsigned long both are 32bit but I can't intermix them without casting... why?
我的电脑显示sizeof
unsigned long
和unsigned int
相同。
但是,当将参数传递给方法时...更具体地说是指针...我必须将unsigned int
重新塑造为unsigned long
. 否则生成错误为Compiler Error C2664":'function' : cannot convert argument n from 'type1' to 'type2'
为什么?
就编译器而言,它们是完全不相关的类型。传递除参数期望的指针之外的任何类型的指针都是错误。
但是,即使编译器认识到这种类型的指针强制转换是可能的并为您执行此操作,这也是为什么这会很糟糕的原因......
C++已经存在了足够长的时间,以至于随着新 CPU 架构的出现和消失,int
和long
都改变了大小。int
和long
的大小取决于您正在使用的编译器和平台,因此,如果它们的大小不同,int*
转换为long*
(反之亦然)可能会导致您遇到各种问题。
根据C++标准,这些是跨各种平台的int
和long
的大小:
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,您才能安全地假设int
和long
的大小相同,但在编译器中支持该假设将允许您编写无法在其他平台上安全编译或运行的代码。
最后,如果您需要保证整数的大小在所有平台上都相同,那么您可以#include <cstdint>
并使用诸如int16_t
、uint16_t
、int32_t
等类型。这些固定宽度的整数可用于支持 C++11 及更高版本的编译器。
相关文章:
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- C ++中无符号位长度类型之间的隐式转换,即uint8_t,uint16_t
- 将浮点数转换为无符号字符数组并打印出来
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 将无符号转换为复杂<int>原因符号转换警告
- 如何解决隐式转换丢失整数精度:'size_t'(又名"无符号长")到'int'警告?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 整数类型应该显式转换(例如"int"到"无符号")还是只会增加混乱?
- 将字符串转换为无符号字符数组/字节数组
- 如何将字符串转换为无符号字符数组