我已经好好看了一下,如果之前有人问过,就找不到类似的问题,所以道歉。
我只是在玩类型和数字,我想知道是否可以保证以下行为。 如果我将2个变量声明为
unsigned char BIT_8 = 0;
unsigned short int BIT_16 = 0xFF01;
然后执行以下操作(暂时忽略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";
我得到了输出
BIT_16: 65281
BIT_8: 0
BIT_8 after: 1
BIT_8 after shift: 255
是否保证如果我将16位类型转换为8位类型,则前导字节将丢失?还是未定义,以上结果是运气?
答案 0 :(得分:21)
如果我将16位类型转换为8位类型而导致前导字节丢失,是否可以保证?
取决于您是使用有符号还是无符号类型(请参阅第4.7节§2和§3):
如果目标类型是无符号,则结果值是与源整数一致的最小无符号整数(模2 ^ n,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,位模式没有变化(如果没有截断)。]
如果目的地类型为已签名,则该值如果可以在目标类型(和位字段宽度)中表示,则不会更改;否则,该值为实现定义。
由于您使用的是无符号类型,因此行为已明确指定。