【问题标题】:negative decimal to binary c code负十进制到二进制 c 代码
【发布时间】:2016-11-09 12:43:31
【问题描述】:

我不能将负十进制写入二进制 c 代码。 需要帮忙 :) 这是我的代码...... 不需要其他包含。

#include <stdio.h>

    int main(void){
        int i;
        int j;
        int b[16];
        printf("input number");
        scanf("%d",&i);
        if(i <= 0) {
            // here is negative decimal code
        } else {
            for(j=15;j>=0;j--) {
                b[j] = i % 2;
                i = i / 2;
            }
            for (j=0;j<=15;j++)
                printf("%d", b[j]);
            printf("\n");
        }
        return 0;
    }

【问题讨论】:

  • "//这里是负十进制代码" ...我没有看到这种情况下的任何代码。你想让别人给你写吗?
  • 你想做什么?建立一个整数数组,其中每个整数都是二进制数字?那有什么好处?任何你不能做的理由for(uint32_t i=0; i&lt;sizeof(int)*8; i++) { printf("%c", number &amp; (1&lt;&lt;i) ? '1' : '0'); }
  • 要打印any对象的二进制编码,考虑this

标签: c


【解决方案1】:

只需将整数视为unsigned,并输出位。

您将获得负数内部表示的位(通常是二进制补码)。不需要单独处理负数。

另外,对于许多初学者来说,这似乎很难理解,i 中的数字不是“十进制”。它是通过读取一串十进制数字来初始化的,但是底层的计算机内存可能正在使用二进制表示来存储它。

实际数字相同:例如2310 = 101112 表示两个实体相同,它们相等。查看特定基数中的数字不会更改数字。

【讨论】:

    【解决方案2】:

    您可以使用位移运算符来获取位。

    #include <stdio.h>
    
        int main(void){
            int i            = 0;
            unsigned int u_i = 0;
            int j            = 0;
            int b[16]        = {0}; //Assuming your integer size is 16bit
    
            printf("input number");
            scanf("%d",&i);
    
            u_i = (unsigned int)i;
    
            for(j=15;j>=0;j--) {
                b[j] = u_i & 0x1;
                u_i  = u_i >> 1;
            }
    
            for (j=0;j<=15;j++)
                printf("%d", b[j]);
    
            printf("\n");
            return 0;
        }
    

    【讨论】:

    • 用负值右移 16 位 int 会导致实现定义的行为 Ref,就像这段代码一样。这可能会产生预期的结果,但 C 并未指定这样做。
    • @chux,我不完全理解那个帖子,但我理解你的意思。我修改了我的代码并使用 unsigned int 进行移位操作。
    【解决方案3】:

    要将有符号整数打印为二进制,请重复除以 2。无需假设宽度为 16,也无需使用 2 的补码。使用&gt;&gt; shifts 会引发实现定义的行为。

    #include <stdio.h>
    #include <stdbool.h>
    
    void print2_helper(int x) {
      bool isodd = x%2;
      x /= 2;
      if (x) print2_helper(x);
      putchar('0' + isodd);
    }
    
    void print2(int x) {
      printf("Decimal:%d\tBinary:", x);
      if (x < 0) putchar('-');
      print2_helper(x);
      putchar('\n');
    }
    
    int main(void){
      print2(0);
      print2(1);
      print2(-1);
      print2(2);
      print2(-2);
      print2(INT_MAX);
      print2(INT_MIN);
      return 0;
    }
    

    输出。

    Decimal:0   Binary:0
    Decimal:1   Binary:1
    Decimal:-1  Binary:-1
    Decimal:2   Binary:10
    Decimal:-2  Binary:-10
    Decimal:2147483647  Binary:1111111111111111111111111111111
    Decimal:-2147483648 Binary:-10000000000000000000000000000000
    

    【讨论】:

      最近更新 更多