隐式类型转换:如果一个操作数较短&;另一个是char,char会转换成short吗?

隐式类型转换:如果一个操作数较短&;另一个是char,char会转换成short吗?,c,char,type-conversion,short,C,Char,Type Conversion,Short,K&R表示,如果任一操作数是int,则另一个操作数将转换为int。当然,这只是在遵循了所有其他规则(如长双精度,浮点,无符号整数等)之后 根据该逻辑,char将被转换为int,如果另一个操作数是int。但是,如果操作中最高的整数类型是short,该怎么办 现在,显然我不需要显式地将char转换为更大的整数,但我确实想知道,ANSI-C是否处理char和short之间的隐式转换?K&R对此没有任何评论 比如,我有以下几行代码: char x = 'x'; short y = 42; short z

K&R表示,如果任一操作数是
int
,则另一个操作数将转换为
int
。当然,这只是在遵循了所有其他规则(如
长双精度
浮点
无符号整数
等)之后

根据该逻辑,
char
将被转换为
int
,如果另一个操作数是
int
。但是,如果操作中最高的整数类型是
short
,该怎么办

现在,显然我不需要显式地将
char
转换为更大的整数,但我确实想知道,ANSI-C是否处理
char
short
之间的隐式转换?K&R对此没有任何评论

比如,我有以下几行代码:

char x = 'x';
short y = 42;
short z = x + y;
x
是否会转换为
short
?还是根本就没有转换


我只是想说清楚:我不是问是否或者如何从
char
转换为
short
。我只是想知道隐式类型转换会发生什么情况。

根据标准,
short
永远不能使用比
char
更少的位数来定义。因此,
x
确实将转换为
short

在添加之前,“整数提升”将两者转换为
int

在表达式中可以使用整型或无符号整型 可用于:

-具有整数类型且其整数转换秩较小的对象或表达式 大于整数和无符号整数的秩

[……] 如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为无符号整数。这些称为整数 晋升


(ISO/IEC ISO/IEC 9899:1999(E),§6.3.1.1)

。这也意味着,当在两个
short
s之间进行一些算术运算时,结果将被分配给另一个
short
,赋值给
short
变量时,操作数将转换为
int
进行计算,然后再转换回
short
?注意,这也意味着在某些系统上,如果
char
无符号(允许,但很少),则升级可能会导致
无符号int
与unsigned int具有相同的范围(允许,但很少)。@DietrichEpp:怎么会发生这种情况?我非常确定,
int
必须能够保存
char
的所有值,不是吗?@supercat:令人惊讶的是,这并不能保证。
signed int
/
int
类型(相同的东西)保证保存由
signed char
表示的所有值。但是,与
int
/
signed int
不同,
char
类型可能与
signed char
类型不同,它可能是
unsigned char
。如果
char
int
的大小相同(例如,都是32位),则
int
无法保存
char
表示的所有值。我相信TI有一个DSP体系结构,它不能加载任何小于一个字的东西,在这个体系结构上,C编译器有
sizeof(int)==1
@DietrichEpp:如果存在
int
中不能容纳的
char
值,像
fgetc()
这样的函数如何工作?可以肯定的是,在
char
int
相同的系统上使用
fgetc()
要比在
int
更大的系统上使用
,因为
EOF
的返回值可以表示文件结束条件,但也可以简单地表示代码与
EOF
的数值匹配的字符。我想在
int
可以表示与
char
一样多的值的情况下,可以说
fgetc()
将返回一个
int
,当转换为
char
时,它将…这是不正确的。两者都将转换为
int
,除非在可能非常奇怪的系统上,它们可能会转换为
无符号int