C中的补码运算符

问题描述

#include<stdio.h>
void main(){
  int i = 3;
  printf("%d",~i);
}

输出为2。3为00000011。Tilde将所有位更改为相反的位置。那么答案是2呢? 正如我从其他帖子中读到的。 2的补码是(~i)+1,它使~ 1的补码运算符。即使是2,怎么可能输出

解决方法

我怀疑答案是2。应该为 -4 ,它是11111100的十进制表示形式。

Online Run ,其输出:

-4

实际上,Two's complement是通过将数字取反并加一个来计算的。因此-4 + 1 = -3,如@WeatherVane所评论。


PS:与您的问题无关,但是main方法通常返回int,而不是void。在What should main() return in C and C++?

中了解更多信息

参考:Section 5.1.2.2.1 of the C11 standard(重点是我):

应使用返回类型int 进行定义,并且不使用 参数:

int main(void) { /* ... */ }

或带有两个参数(尽管此处称为argcargv 可以使用任何名称,因为它们是它们所在的函数的本地名称 声明):

int main(int argc,char *argv[]) { /* ... */ }

或等效形式; 10)或其他实现中定义的方式。

10)因此,int可以用定义为int的typedef名称代替,或者argv的类型可以写为{{1 }},等等。

@JérômeRichard评论。

,
  1. 主要功能应为void Main() { var matches = new[]{ new Match{MatchId=1,SportId=1,StatusId=13,Score=""},new Match{MatchId=2,StatusId=18,new Match{MatchId=3,SportId=2,StatusId=24,}; var scores = new[]{ new{MatchId=1,AScore="10",BScore="0",InfoTypeId=10},new{MatchId=2,AScore="20",InfoTypeId=8},new{MatchId=3,AScore="30",InfoTypeId=5},}; var dict = new Dictionary<int,int>{[13]=10,[14]=10,[15]=10,[16]=10,[17]=10,[20]=24,[21]=23,[18]=8}; var data = (from m in matches join s in scores on m.MatchId equals s.MatchId where s.InfoTypeId == ((m.SportId == 1 && dict.ContainsKey(m.StatusId))? dict[m.StatusId] : 5) select new {m,s} ).ToList(); data.ForEach(o => { o.m.Score = o.s.AScore + "-" + o.s.BScore; }); matches.Dump(); } class Match{public int MatchId; public int SportId; public int StatusId; public string Score;}
  2. 答案不只是2 -4 https://godbolt.org/z/b1GGv8