Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 无符号int和无符号long都是32位的,但我可以';不要在没有铸造的情况下混合它们。。。为什么?_C++_Visual Studio 2012 - Fatal编程技术网

C++ 无符号int和无符号long都是32位的,但我可以';不要在没有铸造的情况下混合它们。。。为什么?

C++ 无符号int和无符号long都是32位的,但我可以';不要在没有铸造的情况下混合它们。。。为什么?,c++,visual-studio-2012,C++,Visual Studio 2012,我的电脑显示无符号长和无符号整数的大小相同 但是,在将参数传递给方法时。。。更具体地说,指针。。。我必须将unsigned int重新编码为unsigned long。否则生成错误为编译器错误C2664:“'function':无法将参数n从'type1'转换为'type2' 为什么?就编译器而言,它们是完全不相关的类型。传递任何类型的指针(参数期望的类型除外)都是错误的 但即使编译器被要求认识到这种类型的指针转换是可能的,并为您这样做,这就是为什么这是不好的 C++已经存在了足够长的时间,in

我的电脑显示
无符号长
无符号整数的大小相同

但是,在将参数传递给方法时。。。更具体地说,指针。。。我必须将
unsigned int
重新编码为
unsigned long
。否则生成错误为
编译器错误C2664:“'function':无法将参数n从'type1'转换为'type2'


为什么?

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

但即使编译器被要求认识到这种类型的指针转换是可能的,并为您这样做,这就是为什么这是不好的

C++已经存在了足够长的时间,
int
long
随着新的CPU架构的出现而改变了大小。
int
long
的大小取决于您使用的编译器和平台,因此,将
int*
转换为
long*
(反之亦然)如果它们的尺寸不一样,会直接导致你进入一个新的领域

根据不同的平台,这些是
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
的大小相同,但在编译器中支持该假设将允许您编写无法在其他平台上安全编译或运行的代码


最后,如果您需要保证整数的大小在所有平台上都是相同的,那么您可以选择并使用诸如
int16\u t
uint16\u t
int32\u t
等类型。这些固定宽度的整数在支持C++11及更高版本的编译器中可用。

它们是完全不相关的类型与mpiler有关。传递参数所需类型以外的任何类型的指针都是错误的

但即使编译器被要求认识到这种类型的指针转换是可能的,并为您这样做,这就是为什么这是不好的

C++已经存在了足够长的时间,
int
long
随着新的CPU架构的出现而改变了大小。
int
long
的大小取决于您使用的编译器和平台,因此,将
int*
转换为
long*
(反之亦然)如果它们的尺寸不一样,会直接导致你进入一个新的领域

根据不同的平台,这些是
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
的大小相同,但在编译器中支持该假设将允许您编写无法在其他平台上安全编译或运行的代码


最后,如果您需要保证整数的大小在所有平台上都是相同的,那么您可以选择并使用诸如
int16\u t
uint16\u t
int32\u t
等类型。这些固定宽度的整数可用于支持C++11及更高版本的编译器。

,因为它们是不同的类型ct Foo{int x;}
结构条{int x;}
是不同的类型,即使它们具有相同的布局。它们是不同的类型,而且大小是实现定义的隐式转换无法通过指针工作。产生该错误的代码示例将有助于使这个问题在将来对其他人更有用。因为它们是不同的类型。就像
struct一样Foo{int x;}
struct Bar{int x;}
是不同的类型,即使它们具有相同的布局。它们是不同的类型,而且大小是实现定义的,隐式转换不能通过指针工作。产生该错误的代码示例将有助于使这个问题在将来对其他人更有用。