【发布时间】:2019-04-16 08:42:43
【问题描述】:
从一个伪代码sn-p开始:
char a = 0x80;
unsigned short b;
b = (unsigned short)a;
printf ("0x%04x\r\n", b); // => 0xff80
根据我目前的理解,“char”既不是有符号字符也不是无符号字符,而是第三种类型的符号。
为什么会发生“a”是第一个符号从(可能取决于平台)扩展为 8 位存储到(可能又是特定于平台)16 位有符号短符号,然后转换为无符号短符号?
有确定扩展顺序的c标准吗?
本标准是否以任何方式指导如何处理“纯”字符(我曾将其称为 X-char,x 表示未确定的签名)的第三种类型的签名,以便结果至少是确定性的?
PS:如果在赋值行的'a'前面插入“(unsigned char)”语句,那么打印行的结果确实会变成0x0080。因此,连续只有两个类型转换将提供某些意图的预期结果。
【问题讨论】:
-
char怎么可能既不是signed也不是unsigned?这没有意义。 -
为什么在处理数字时不使用
signed char而不是unsigned char,而在处理字符时使用char? -
@FiddlingBits --
char、signed char和unsigned char根据标准是不同的类型,因此混淆是可以理解的。可移植代码不能将裸char视为signed或unsigned,除非该实现细节已知。 -
@David:感谢“便携式代码”的措辞——这就是我真正的意思。如果您为可移植性编写代码,那么您必须将 /undecorated/ char 作为“第三种类型”处理 - 即使它与其他两种变体之一兼容 - 但您在代码编写时不会知道,只有在编译时或稍后。