将负十进制转换为其二进制表示

Posted

技术标签:

【中文标题】将负十进制转换为其二进制表示【英文标题】:Turning a negative decimal into its binary representation 【发布时间】:2021-12-07 16:22:06 【问题描述】:

我正在尝试找出一种方法,我可以从用户那里获取输入,并将其显示在 BinRep[] 数组中。目前这个程序只适用于正数,但是我很难找到一种方法让它也适用于负数。有什么想法吗?

int n = atoi(argv[1]);
  int binRep[N];
  int i;
  int flippedNum;

  for (i = 0; i < N; i++) 
    binRep[i] = 0;
  

  i = 0;

  while (n > 0) 
    binRep[i] = n % 2;
    n = n / 2;
    i++;
  

  for (i = N - 1; i >= 0; i--) 
    printf("%d", binRep[i]);
  
  printf("\n");
  return 0;

【问题讨论】:

您了解带符号的数字如何用二进制表示 - 即二进制补码吗?一种方法是将正数转换为二进制,然后应用二进制补码来获得负表示。似乎您或编写代码的人可能已经按照未使用的flippedNum 变量所暗示的这些思路进行思考。 您是否只是想在二进制中显示与输入为正数相同的数字,但前面有一个- 没有。二进制输出应该是数字的正数。 IE -7 和 7 应该输出相同(二进制为 7)。 哦,那听起来你只需要添加n = abs(n);。别忘了#include &lt;math.h&gt; 这就是我原本打算做的,但它似乎太简单了。输出是正确的,但我有一种可疑的感觉,由于某种原因它不会通过 GitHub autograder ......无论如何,感谢您的帮助!如果不允许,我想我会回信。 【参考方案1】:
unsigned int n = (unsigned int ) atoi( argv[1] );
unsigned int binRep[N];

应该工作

但负数将采用二进制补码表示。

【讨论】:

命令行输入必须是有效的有符号整数。这就是为什么我在其他方面遇到麻烦。 1.) 命令行的输入始终是 char * 2.) atoi( argv[1] ) 输出 int 3.) (unsigned int) 将此输出转换为 unsigned int 你能解释一下为什么这样有效吗?我希望能够完全理解和掌握它。 twos complement wikipedia 如果您无法理解我的评论,我会推荐“C 编程语言” 我阅读了 Wiki 文章和其他一些堆栈溢出帖子。我仍然没有完全掌握它,这似乎很重要。无论如何,你可以给我一个简短的说明为什么会这样吗?

以上是关于将负十进制转换为其二进制表示的主要内容,如果未能解决你的问题,请参考以下文章

如何将负二进制数转换为int?

从整数转换为其二进制表示

将十六进制 unicode 字符转换为其可视化表示

将负分数转换为 IEEE 754

在 Arduino 中不使用 String 对象将二进制数据转换为其 ASCII 等价物

在c ++中将负整数转换为二进制字符串