C中的隐式类型转换是否对char和short变量保持相同的等级?

crcmnpdw  于 2023-06-05  发布在  其他
关注(0)|答案(1)|浏览(102)

在C程序设计中,隐式的类型转换顺序是从高到低:

这里char和short的秩是否相同,意味着没有从char到short或short到char的隐式转换?
char为-1字节,short为-2字节
既然这两种类型的大小不同,它们如何在同一等级中?

tzdcorbm

tzdcorbm1#

您提供的图像是错误的。首先,用char类型来排列short int是完全不正确的。根据C11标准(草案)第1段6.3.1.1布尔、字符和整数
长长int的秩应大于长int的秩,长int的秩应大于int的秩,int的秩应大于短int的秩,短int的秩应大于有符号char的秩。
和C数值类型有一个更复杂的安排比简单的线性“排名”的形象。
请注意,浮点类型floatdoublelong double没有与上面引用的www.example.com中的整数类型一起排名6.3.1.1。正如你的问题的注解中所指出的,当数字类型混合时,它们会受到所谓的普通算术转换的影响:
许多期望算术类型操作数的运算符会以类似的方式导致转换并产生结果类型。目的是确定操作数和结果的通用真实的类型。对于指定的操作数,在不改变类型域的情况下,将每个操作数转换为其对应的真实的类型是公共实类型的类型。除非另有明确说明,否则公共真实的类型也是结果的对应实类型,如果它们相同,则其类型域是操作数的类型域,否则是复杂的。这种模式称为常用的算术转换:

  • 首先,如果任一操作数的对应真实的类型是长双精度型,则另一操作数被转换成其对应实类型是长双精度型的类型,而不改变类型域。
  • 否则,如果任一操作数的对应真实的类型是double,则另一操作数在不改变类型域的情况下被转换为其对应实类型是double的类型。
  • 否则,如果任一操作数的对应真实的类型是float,则另一操作数在不改变类型域的情况下被转换为对应实类型是float的类型。
  • 否则,对两个操作数执行整数提升。然后将以下规则应用于提升的操作数:
  • 如果两个操作数具有相同的类型,则不需要进一步的转换。
  • 否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换秩的类型的操作数被转换为具有较大秩的操作数的类型。
  • 否则,如果具有无符号整数类型的操作数的秩大于或等于另一操作数的类型的秩,则具有有符号整数类型的操作数被转换为具有无符号整数类型的操作数的类型。
  • 否则,如果具有有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数的类型的所有值,则具有无符号整数类型的操作数被转换为具有有符号整数类型的操作数的类型。
  • 否则,两个操作数都转换为与具有有符号整数类型的操作数的类型相对应的无符号整数类型。

请注意这里的顺序--首先,类型被转换为适当的浮点类型(如果适用的话)。
然后“否则,在两个操作数上都执行整数提升。”这很重要-在执行计算之前,小于int的类型的变量被提升为int(或unsigned int)。您提供的图片没有说明这一点。整数提升指定为:
如果一个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

相关问题