将大数字类型转换为较小的类型

Casting a large number type to a smaller type

本文关键字:类型 数字 类型转换      更新时间:2023-10-16

我仔细看了一下周围,没有找到类似的问题,所以如果以前有人问过这个问题,我很抱歉。

我只是玩弄类型和数字,我想知道是否可以保证以下行为。如果我声明两个变量为

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位类型,前导字节将丢失?还是没有定义,以上结果是运气?

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

取决于你使用的是有符号类型还是无符号类型(参见4.7§2和§3):

如果目标类型为unsigned,则结果值是与源整数相等于的最小无符号整数(对2^n取模,其中n是用于表示无符号类型的位数)。[注意:在二进制补码表示中,这种转换是概念性的,位模式不会改变(如果没有截断)。]

如果目的类型是带符号的,如果该值可以用目的类型(和位域宽度)表示,则该值不变;否则,该值为实现定义的