负十进制到二进制c代码

时间:2016-11-09 12:43:31

标签: c

我不能将负十进制写入二进制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;
    }

3 个答案:

答案 0 :(得分:2)

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

您将获得负数的内部表示位(通常为2的补码)。无需单独处理负数。

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

实际数字是相同的:例如23 10 = 10111 2 意味着两个实体是相同的,它们是相同的。查看特定基数中的数字不会改变数字。

答案 1 :(得分:2)

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

#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;
    }

答案 2 :(得分:1)

要将有符号整数打印为二进制,请执行重复除以2.无需假设宽度为16,也不使用2的补码。使用>>轮班会邀请实施定义的行为。

#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