问题描述
#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) { /* ... */ }
或带有两个参数(尽管此处称为
argc
和argv
可以使用任何名称,因为它们是它们所在的函数的本地名称 声明):int main(int argc,char *argv[]) { /* ... */ }
或等效形式; 10)或其他实现中定义的方式。
10)因此,
int
可以用定义为int
的typedef名称代替,或者argv
的类型可以写为{{1 }},等等。
@JérômeRichard评论。
,- 主要功能应为
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 -4 https://godbolt.org/z/b1GGv8