将大量类型转换为较小的类型

tom*_*502 18 c++ types

我已经好好看了一下,找不到类似的问题,如果之前被问过,请道歉.

我只是在玩类型和数字,我想知道是否可以保证以下行为.如果我将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位类型,则前导字节将丢失?或者它是不确定的,上面的结果是运气?

fre*_*low 21

是否保证如果我将16位类型转换为8位类型,则前导字节将丢失?

取决于您是使用有符号还是无符号类型(请参阅第4.7节§2和§3):

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数).[注意:在二进制补码表示中,这种转换是概念性的,并且位模式没有变化(如果没有截断).

如果目标类型已签名,则如果可以在目标类型(和位字段宽度)中表示该值,则该值不会更改; 否则,该值是实现定义的.

由于您使用的是无符号类型,因此行为已明确指定.