我已经好好看了一下,找不到类似的问题,如果之前被问过,请道歉.
我只是在玩类型和数字,我想知道是否可以保证以下行为.如果我将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是用于表示无符号类型的位数).[注意:在二进制补码表示中,这种转换是概念性的,并且位模式没有变化(如果没有截断).
如果目标类型已签名,则如果可以在目标类型(和位字段宽度)中表示该值,则该值不会更改; 否则,该值是实现定义的.
由于您使用的是无符号类型,因此行为已明确指定.
| 归档时间: |
|
| 查看次数: |
9037 次 |
| 最近记录: |