C++ 带位移位的表达式中的隐式类型强制转换

C++ 带位移位的表达式中的隐式类型强制转换,c++,64-bit,C++,64 Bit,在下面的代码中,why1字节anUChar自动转换为4字节,以生成所需的结果0x300(如果anUChar的大小保持为1字节,则不是0x0): 无符号字符anUChar=0xc0;//仅设置两个最高有效位 int anInt=anUCharchar在算术过程中总是被提升为int。我认为这是C标准中规定的行为 但是,int不会自动升级为long 在下,如果您尝试左移较小的整数并将其存储到较大的整数中,某些编译器(VisualStudio)实际上会对此发出警告 顺便问一下,这两个选项中哪一个最正确且

在下面的代码中,why1字节
anUChar
自动转换为4字节,以生成所需的结果0x300(如果
anUChar
的大小保持为1字节,则不是0x0):

无符号字符anUChar=0xc0;//仅设置两个最高有效位

int anInt=anUChar
char
在算术过程中总是被提升为
int
。我认为这是C标准中规定的行为

但是,
int
不会自动升级为
long

在下,如果您尝试左移较小的整数并将其存储到较大的整数中,某些编译器(VisualStudio)实际上会对此发出警告


顺便问一下,这两个选项中哪一个最正确且可移植:
(type)var,因为整数提升。对于大多数运算符(例如,
对于位移位操作,较短的整数类型被提升为
int
类型。这与您分配移位结果的类型无关

在64位机器上,您的第二段代码也会有同样的问题,因为int类型通常也是32位宽。(在x86和x64之间,
long-long-int
通常是64位和
int
32位,只有
long-int
取决于平台。)


< P>(在C++的精神中,我将把转换写为<代码>(未签名的长long int)(Auint)转换确实发生了。问题是表达式
anUInt@Oli的结果。你说得对,让我来编辑!我在想
long int
。你可能想谈谈为什么字符会被转换,因为你的帖子无意中暗示它不应该被转换。
表达式的结果anUInt谢谢。但是我没有编译我问题中的第二段代码是VC++9.0,最高警告级别为4级,没有产生任何警告。我刚刚记住了这一点。如果该值用作指针偏移量,它只适用于x64。感谢您指出这一点。我回到计算机后会修复我的答案。(现在在iPhone上)@纳文:我刚刚修正了我的答案。Visual Studio有时会发出以下警告:
unsigned char anUChar = 0xc0; // only the two most significant bits are set
int anInt = anUChar << 2; // 0x300 (correct)
unsigned int anUInt = 0xc0000000; // only the two most significant bits are set
long long aLongLong = anUInt << 2; // 0x0 (wrong, means no conversion occurred)
unsigned int anUInt = 0xc0000000;
long long aLongLong = (long long)anUInt << 2; // 0x300000000 (correct)
unsigned char anUChar = 0xc0; 
int anInt = anUChar << 2;