任何人都可以解释此程序的类型促销以及为什么输出相同

Can anyone explain type promotion of this program and why output is same

本文关键字:为什么 输出 解释 都可以 程序 类型 任何人      更新时间:2023-10-16

为什么这两个数字比较x和y进行的比较如何?

#include <stdio.h>
int  main() 
{ 
   unsigned int x = -1; 
   int y = ~0; //type promotion from int to unsigned int
   if (x == y) 
      printf("same"); 
   else
      printf("not same"); 
   return 0; 
}

c 中的〜运算符(以及其他类似C和Java(例如C和Java(的语言(执行一个非操作 - 操作数中的所有1位都设置为0,所有0位且所有0位在操作数中设置为1。换句话说,它创建了原始数字的补充。有关更多详细信息,请参见此处。

位不是运算符具有有趣的属性 关于两个补充代表的数字,它改变了数字的 签名然后减去一个(如以上示例中所示(。

如果您检查了〜-operator对此做什么:

#include <stdio.h>
int  main() 
{ 
   unsigned int x = -1; 
   printf("%in",x); // treat data as if singed integer
   printf("%un",x); // treat data is if unsigned integer
   int y = ~0; //type promotion from int to unsigned int
   printf("%in",y);
   if (x == y) 
      printf("same"); 
   else
      printf("not same"); 
   return 0; 
}

您可以看到:

成功时间:0内存:16064信号:0

-1相同

在这里尝试。

为什么这样?

整数中-1的位表示(有关详细信息,请参见两者的补充(

11111111 11111111 11111111 11111111 

如果您在未签名的整数中阅读此信息

11111111 11111111 11111111 11111111

是最大的未签名int。-1在未签名的int中成为由于周围的最大无符号int数。因此,无符号-1和int〜0是相同的。