【问题标题】:Implicit integer type conversion in CC中的隐式整数类型转换
【发布时间】:2015-09-02 23:37:09
【问题描述】:

我了解 C 语言在整数和浮点类型之间的隐式转换,但我对有符号/无符号隐式类型转换有疑问。

例如,如果添加unsigned charsigned int,结果类型是什么?会是unsigned intsigned int,还是别的什么?

我在 C99 ANSI 标准中没有看到任何关于此的具体内容,因此感谢您提供任何帮助。

【问题讨论】:

  • C 中没有“隐式转换”这样的东西。cast 是一个运算符,由括号中的类型名称组成;它指定转换。 C有隐式转换和显式转换;根据定义,强制转换是显式的。

标签: c implicit-conversion


【解决方案1】:

在 C99 中,引用为 6.3.1.8“常用算术转换”。

许多期望算术类型操作数的运算符会导致转换并产生结果 以类似的方式键入。目的是为操作数确定一个通用的实数类型 和结果。对于指定的操作数,每个操作数都进行转换,不改变类型 域,到对应的实类型是公共实类型的类型。除非 另有明确说明,公共实类型也是对应的实类型 结果,其类型域是操作数的类型域(如果它们相同), 否则复杂。这种模式称为通常的算术转换:

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

加法执行通常的算术转换,因此,在将 unsigned charsigned int 相加时:

  • 首先将unsigned char提升为int,然后两种类型相同,所以结果为int类型,或者
  • (不常见)int 不能代表所有可能的 unsigned char 值。在这种情况下,unsigned char 被提升为unsigned int,并且第三个子项目符号适用:unsigned intint 具有相同的等级,因此int 操作数被转换为unsigned int,结果为输入unsigned int

【讨论】:

    【解决方案2】:

    几乎可以肯定是signed int,它取决于代码运行的系统。查看段落整体推广here

    unsigned charunsigned short 可以转换为int 如果可以持有 它的整个值范围,否则unsigned int

    例如在 POSIX 系统上,它肯定是 signed int,因为 char 总是 8 位,int 至少是 16 位。因此int 可以代表unsigned char 的所有可能值。显然有systems,其中char 超过8 位。

    【讨论】:

    • 小心:“否则为unsigned int”。您自己的引用与您的答案相矛盾。
    • 你应该为 C 使用 this link instead(你的用于 C++)。
    • @pablo1977 在某些(不知名的)系统中确实可以升级为unsigned int。例如,charint 的大小都可以是 16 位。虽然我不确定这样的系统是否真的存在!
    • 感谢 Chrono Kitsune。我修改了链接。
    • @Manos Nikolaidis:是的,确实存在。该主题是几个月前在 SO 中说明的,但我不记得该帖子的确切位置。
    猜你喜欢
    • 1970-01-01
    • 2011-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多