在C程序设计中,隐式的类型转换顺序是从高到低:
这里char和short的秩是否相同,意味着没有从char到short或short到char的隐式转换?char为-1字节,short为-2字节既然这两种类型的大小不同,它们如何在同一等级中?
tzdcorbm1#
您提供的图像是错误的。首先,用char类型来排列short int是完全不正确的。根据C11标准(草案)第1段6.3.1.1布尔、字符和整数:长长int的秩应大于长int的秩,长int的秩应大于int的秩,int的秩应大于短int的秩,短int的秩应大于有符号char的秩。和C数值类型有一个更复杂的安排比简单的线性“排名”的形象。请注意,浮点类型float、double和long double没有与上面引用的www.example.com中的整数类型一起排名6.3.1.1。正如你的问题的注解中所指出的,当数字类型混合时,它们会受到所谓的普通算术转换的影响:许多期望算术类型操作数的运算符会以类似的方式导致转换并产生结果类型。目的是确定操作数和结果的通用真实的类型。对于指定的操作数,在不改变类型域的情况下,将每个操作数转换为其对应的真实的类型是公共实类型的类型。除非另有明确说明,否则公共真实的类型也是结果的对应实类型,如果它们相同,则其类型域是操作数的类型域,否则是复杂的。这种模式称为常用的算术转换:
char
short int
float
double
long double
请注意这里的顺序--首先,类型被转换为适当的浮点类型(如果适用的话)。然后“否则,在两个操作数上都执行整数提升。”这很重要-在执行计算之前,小于int的类型的变量被提升为int(或unsigned int)。您提供的图片没有说明这一点。整数提升指定为:如果一个int可以表示原始类型的所有值(对于位字段,受宽度的限制),则该值被转换为int;否则,它将被转换为unsigned int。这些称为整数提升。只有在所有这些之后,整数排名才适用。所有这些都是在每个操作符的基础上,按优先级完成的。有些结果可能会令人惊讶,如果你没有意识到这一点:
int
unsigned int
int a, b; float x; ... float y = x + a/b;
在这种情况下,a/b的计算是使用整数算术完成的,而不是浮点运算。只有在 * a/b被计算为整数值之后,它才被转换为float并被添加到x。因此,如果a小于b,则0.0将被添加到x。
a/b
x
a
b
0.0
1条答案
按热度按时间tzdcorbm1#
您提供的图像是错误的。首先,用
char
类型来排列short int
是完全不正确的。根据C11标准(草案)第1段6.3.1.1布尔、字符和整数:长长int的秩应大于长int的秩,长int的秩应大于int的秩,int的秩应大于短int的秩,短int的秩应大于有符号char的秩。
和C数值类型有一个更复杂的安排比简单的线性“排名”的形象。
请注意,浮点类型
float
、double
和long double
没有与上面引用的www.example.com中的整数类型一起排名6.3.1.1。正如你的问题的注解中所指出的,当数字类型混合时,它们会受到所谓的普通算术转换的影响:许多期望算术类型操作数的运算符会以类似的方式导致转换并产生结果类型。目的是确定操作数和结果的通用真实的类型。对于指定的操作数,在不改变类型域的情况下,将每个操作数转换为其对应的真实的类型是公共实类型的类型。除非另有明确说明,否则公共真实的类型也是结果的对应实类型,如果它们相同,则其类型域是操作数的类型域,否则是复杂的。这种模式称为常用的算术转换:
请注意这里的顺序--首先,类型被转换为适当的浮点类型(如果适用的话)。
然后“否则,在两个操作数上都执行整数提升。”这很重要-在执行计算之前,小于
int
的类型的变量被提升为int
(或unsigned int
)。您提供的图片没有说明这一点。整数提升指定为:如果一个int可以表示原始类型的所有值(对于位字段,受宽度的限制),则该值被转换为int;否则,它将被转换为unsigned int。这些称为整数提升。
只有在所有这些之后,整数排名才适用。
所有这些都是在每个操作符的基础上,按优先级完成的。有些结果可能会令人惊讶,如果你没有意识到这一点:
在这种情况下,
a/b
的计算是使用整数算术完成的,而不是浮点运算。只有在 *a/b
被计算为整数值之后,它才被转换为float
并被添加到x
。因此,如果a
小于b
,则0.0
将被添加到x
。