📜  C中的整数促销

📅  最后修改于: 2021-05-25 19:17:24             🧑  作者: Mango

一些数据类型,如短整型采取小于INT的字节数,当对它们进行操作,这些数据类型被自动提升为intunsigned int。这称为整数提升。例如,在较小的类型(如charshortenum)上不会进行算术计算。首先将它们转换为intunsigned int ,然后对它们进行算术运算。如果int可以表示原始类型的所有值,则该值将转换为int 。否则,它将转换为unsigned int。

例如,请参见以下程序。

#include  
int main()
{
    char a = 30, b = 40, c = 10;
    char d = (a * b) / c;
    printf ("%d ", d); 
    return 0;
}

输出:

120

乍看之下,表达式(a * b)/ c似乎引起算术溢出,因为带符号的字符只能具有-128到127的值(在大多数C编译器中),而子表达式的值’(a * b) ‘是1200,大于128。但是整数提升是在char类型进行算术运算时发生的,我们得到了适当的结果而没有任何溢出。

考虑下面的程序作为另一个示例

#include 
  
int main()
{
    char a = 0xfb;
    unsigned char b = 0xfb;
  
    printf("a = %c", a);
    printf("\nb = %c", b);
  
    if (a == b)
      printf("\nSame");
    else
      printf("\nNot Same");
    return 0;
}

输出:

a = ?
b = ?
Not Same 

当我们打印“ a”和“ b”时,将打印相同的字符,但是当我们比较它们时,我们得到的输出为“不相同”。
‘a’和’b’与char具有相同的二进制表示形式。但是,当对“ a”和“ b”执行比较操作时,它们首先被转换为int。 ‘a’是一个有符号的char ,当将其转换为int时,其值变为-5(有符号的值0xfb)。 ‘b’是无符号字符,当将其转换为int时,其值变为251。值-5和251具有不同的int表示形式,因此我们得到的输出为“ Not Same”。

我们很快将讨论有符号和无符号,int和long int等之间的整数转换规则。

参考:
http://www.tru64unix.compaq.com/docs/base_doc/DOCUMENTATION/V40F_HTML/AQTLTBTE/DOCU_067.HTM

想要从精选的最佳视频中学习和练习问题,请查看《基础知识到高级C的C基础课程》。