隐式类型转换:如果一个操作数较短&;另一个是char,char会转换成short吗?
K&R表示,如果任一操作数是隐式类型转换:如果一个操作数较短&;另一个是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
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
。