我已经好好看了一下,找不到类似的问题,如果之前被问过,请道歉.
我只是在玩类型和数字,我想知道是否可以保证以下行为.如果我将2个变量声明为
unsigned char BIT_8 = 0;
unsigned short int BIT_16 = 0xFF01;
Run Code Online (Sandbox Code Playgroud)
然后执行以下操作(暂时忽略C样式转换,除非这会影响它?)
cout << "BIT_16: " << BIT_16 << "\n";
cout << "BIT_8: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16;
cout << "BIT_8 after: " << (int)BIT_8 << "\n";
BIT_8 = BIT_16 >> 8;
cout << "BIT_8 after shift: " << (int)BIT_8 << "\n";
Run Code Online (Sandbox Code Playgroud)
我得到了输出
BIT_16: 65281
BIT_8: 0
BIT_8 after: 1
BIT_8 after shift: 255
Run Code Online (Sandbox Code Playgroud)
是否保证如果我将16位类型转换为8位类型,则前导字节将丢失?或者它是不确定的,上面的结果是运气?
我有一个这样的测试程序:
int main()
{
unsigned n = 32;
printf("ans << 32 = 0x%X\n", (~0x0U) << 32);
printf("ans >> 32 = 0x%X\n", (~0x0U) >> 32);
printf("ans << n(32) = 0x%X\n", (~0x0U) << n);
printf("ans >> n(32) = 0x%X\n", (~0x0U) >> n);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它产生以下输出:
ans << 32 = 0x0 ... (1)
ans >> 32 = 0x0 ... (2)
ans << n(32) = 0xFFFFFFFF ... (3)
ans >> n(32) = 0xFFFFFFFF ... (4)
Run Code Online (Sandbox Code Playgroud)
我期望(1)和(3)是相同的,以及(2)和(4)是相同的.
使用gcc版本:gcc.real(Ubuntu 4.4.1-4ubuntu9)4.4.1
怎么了?