微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C中的补码运算符

如何解决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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。