我发现C99标准中有一项声明,否认了类型char和类型signed char / unsigned char之间的兼容性。
C99标准的注释35:
CHAR_MIN在limits.h中定义,将具有值0或SCHAR_MIN之一,这可用于区分两个选项。无论做出什么选择,char都是与其他两种类型不兼容的单独类型。
我的问题是,为什么委员会否认了它们之间的兼容性?这是什么原理?如果char与signed char或unsigned char兼容,会发生什么可怕的事情吗?
C99标准的注释35:
CHAR_MIN在limits.h中定义,将具有值0或SCHAR_MIN之一,这可用于区分两个选项。无论做出什么选择,char都是与其他两种类型不兼容的单独类型。
我的问题是,为什么委员会否认了它们之间的兼容性?这是什么原理?如果char与signed char或unsigned char兼容,会发生什么可怕的事情吗?
char
是有符号的实现,char
和signed char
是不同的类型,但是你可以自由地在它们之间赋值(存在隐式转换)。指针类型没有隐式转换(除了涉及void*
和空指针常量的特殊情况),因此char*
和signed char*
不能互相赋值而不使用强制转换。使它们不兼容可以让编译器诊断错误,如果您将代码移植到普通char
为无符号的系统上,则可能会出现真正的问题。 - Keith Thompsonchar
和signed char
视为相同类型。(它的C++编译器没有这个bug。)https://developercommunity2.visualstudio.com/t/_Generic-char-signed-char-unsigned-cha/1228885?preview=true 微软的回应是:“我们的团队优先处理对广大客户有影响的产品问题”。 - Keith Thompson