【问题标题】:Complement operator in CC中的补码运算符
【发布时间】:2021-01-25 09:24:29
【问题描述】:
#include<stdio.h>
void main(){
  int i = 3;
  printf("%d", ~i);
}

输出是 2。3 是 0000 0011。波浪号将所有位更改为相反的位。那么答案是2吗? 正如我从其他帖子中读到的那样。 2 的补码是 (~i)+1,这使得 ~ 成为 1 的补码运算符。即使是这样,2如何可能的输出?

【问题讨论】:

  • void main() 是错误的。 The output is 2 我无法得到这个输出。你用的是什么编译器?您正在使用哪些编译器选项?您使用的是什么操作系统?
  • 这里的输出是-4
  • 你从哪里得到这样的输出?
  • 什么输出? echo $? 的结果,也许?
  • @AnaghBasak,它是一样的,你可以制作 8 位表示 1111 1100 甚至是 64 位表示 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1是一样的-4。

标签: c twos-complement tilde


【解决方案1】:

我怀疑答案是 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 的类型可以写为char **argv,等等。

正如@JérômeRichard 评论的那样。

【讨论】:

  • 我在完成之前按了“Enter”,所以我删除了它。 3 的补码肯定是-3?反转并添加1
  • 绝对是@WeatherVane,非常感谢您的评论和投票,答案已更新! :)
【解决方案2】:
  1. 主函数应该是int main(void)
  2. 答案不只是 2 -4 https://godbolt.org/z/b1GGv8

【讨论】:

  • 我有一个问题是程序员可以选择返回类型的普通函数。 main() 有什么不同。我以 void 返回类型运行 main() 的每个程序都没有产生问题?当我将返回类型更改为 void 时,实际上出了什么问题?
  • @AnaghBasak 看看Section 5.1.2.2.1 of the C11 standard。合理的是主机环境(即操作系统)需要知道程序是否正确完成并且没有int兼容类型作为返回类型(例如void),“返回到主机环境的状态是未指定”(即大多数操作系统上的未定义行为)。
  • @AnaghBasak 当您在程序中编写方法时,例如int read_file(char filename[16]);,那么您希望作为此方法的调用者知道一切是否顺利(因为可能会发生故障,例如找不到文件)。通过检查方法的返回值,您可以知道一切是否顺利,这是方法向您发出成功与否执行的信号,并让调用者(您)决定如何处理意外失败。所以现在想象我为一个用于更复杂系统的微机制编写了一个 C 程序。当系统调用...
  • ...微机制,它想知道一切是否按预期进行,以便它可以处理任何潜在的错误。如果 C 程序的 main 方法将返回void,那么调用系统如何知道其子系统(微机制)的执行情况?它不能,这就是main() 返回int 的原因,以便与其调用者通信成功(或不)​​执行。那是一个帮助我在大学时理解签名的示例,希望对您有所帮助。 :)
  • 谢谢你这么容易上当的解释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 1970-01-01
  • 2020-08-09
相关资源
最近更新 更多