Ale*_*ohr 1 c casting short char
从伪代码段开始:
char a = 0x80;
unsigned short b;
b = (unsigned short)a;
printf ("0x%04x\r\n", b); // => 0xff80
Run Code Online (Sandbox Code Playgroud)
根据我目前的理解,“ char”从定义上来说既不是带符号的char也不是未签名的char,而是某种第三种签名。
怎么会发生“ a”的第一个符号从一个8位存储(可能与平台有关)扩展到一个16位带符号的short的符号扩展(然后又可能是平台特定的)的情况,然后转换为一个无符号的short?
是否有确定扩展顺序的交流标准?
该标准是否以任何方式指导了如何处理“纯”字符(我称其为X字符,x表示不确定的字符)的第三种类型的签名,从而使结果至少具有确定性?
PS:如果在赋值行的'a'前面插入“(unsigned char)”语句,则打印行中的结果确实更改为0x0080。因此,连续只有两种类型的转换会提供某些意图的预期结果。
该类型char不是“第三”签名。它是signed char或unsigned char,并且是实现定义的哪个。
这三种类型
char,signed char以及unsigned char统称为字符类型。实现应定义char为具有相同的范围,表示和行为如任一signed char或unsigned char。
看来在您的实现上,char它与相同signed char,因此,因为该值为负,并且因为目标类型是未签名的,所以必须对其进行转换。
第6.3.1.3节规定了整数类型之间如何进行转换:
1将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。
2否则, 如果新类型是无符号的,则通过在新类型可以表示的最大值之前反复加或减一,来转换值,直到该值在新类型的范围内。
3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。
由于值0x80 == -128不能用表示,unsigned short因此发生了第2段中的转换。