C中的隐式整数类型转换

时间:2015-09-02 23:37:09

标签: c implicit-conversion

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

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

我没有在C99 ANSI标准中看到任何具体内容,因此我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:6)

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

  

许多期望算术类型操作数的运算符会导致转换并产生结果   以类似的方式输入类型。目的是确定操作数的公共实型   和结果。对于指定的操作数,将转换每个操作数,而不更改类型   域,对应的实类型是常见的实类型。除非   另外明确说明,常见的真实类型也是相应的实际类型   结果,其类型域是操作数的类型域,如果它们是相同的,   否则复杂。此模式称为通常的算术转换:

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

添加执行通常的算术转换,因此,在添加unsigned charsigned int时,要么:

  • 首先unsigned char被提升为int,然后两种类型相同,因此结果类型为int
  • (不常见)int无法代表所有可能的unsigned char值。在这种情况下,unsigned char将提升为unsigned int,第三个子项适用:unsigned int具有与int相等的排名,因此int操作数为转换为unsigned int,结果类型为unsigned int

答案 1 :(得分:1)

几乎肯定是signed int,它取决于代码运行的系统。查看段落积分促销 here

  

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

在POSIX系统上,它肯定是signed int,因为char总是8位,int至少是16位。因此,int可以代表unsigned char的每个可能值。显然systems char更多是8位。