如何将64位的十进制转换为二进制?

时间:2017-03-16 20:18:59

标签: c binary decimal data-conversion

所以我有这段代码

int main()
{
  int n, c, k;

  printf("Enter an integer\n");
  scanf("%d", &n);

  printf("%d in binary is:\n", n);

  for (c = 31; c >= 0; c--)
  {
    k = n >> c;

    if (k & 1)
      printf("1");
    else
      printf("0");
  }

  printf("\n");

  return 0;

}

它将十进制转换为二进制,但仅为32位。当我将其更改为64位时,它不起作用(似乎它只是将32位的结果加倍)。同时它可以正常工作8或4位等。 我做错了什么?

3 个答案:

答案 0 :(得分:2)

  

它将十进制转换为二进制,但只能转换为32位。当我将其更改为64位时,它不起作用(看起来它只是将32位的结果加倍)。

问题出在这里。

  int n, c, k;

  printf("Enter an integer\n");
  scanf("%d", &n);

nint,可以小到16位。它可能是64位,但它可能是32位。当您尝试输入64位数字时,您将获得垃圾。

#include <stdio.h>

int main() {
    int n;

    printf("sizeof(int) == %zu\n", sizeof(int));

    printf("Enter an integer\n");
    scanf("%d", &n);

    printf("n = %d\n", n);
}

$ ./test
sizeof(int) == 4
Enter an integer
12345678901
n = -539222987

相反,您可以使用long long int,其最小大小为64位,int64_t来自stdint.h,正好是64位。我倾向于在需要特定宽度的代码中使用显式宽度类型,以使读者更清楚。

long long int使用%lld用于scanfprintf,而int64_t使用macros from inttypes.h。下面的代码利用C自动连接常量字符串; "foo" "bar""foobar"相同。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

int main() {
    int64_t n;

    printf("Enter an integer\n");

    scanf("%"SCNd64, &n);

    printf("n = %"PRId64"\n", n);
}


$ ./test
Enter an integer
12345678901
n = 12345678901

答案 1 :(得分:0)

问题是你的n&amp; k变量的数据类型。它们是整数。使用sizeof(int)检查平台的数据类型大小。

当您更改为64位时,这些变量不能保存64位值。

HTH!

答案 2 :(得分:0)

以下代码是解决问题的一种方法:

#include <stdio.h>
#include <stdlib.h>

int main( void )
{
    long long unsigned int n;
    long long          int c;
    long long unsigned int k;

    printf("Enter an integer\n");
    if( 1 != scanf("%llu", &n) )
    {
        perror( "scanf for 64 bit number failed" );
        exit( EXIT_FAILURE );
    }

    // implied else, scanf successful

    printf("%llu in binary is:\n", n);

    for (c = 63; c >= 0; c--)
    {
        k = n >> c;

        if (k & 1)
            putc('1', stdout);
        else
            putc('0', stdout);
    }

    printf("\n");

    return 0;
} // end function: main

以下是程序典型运行的输出:

Enter an integer
6789097860397846  
6789097860397846 in binary is:
0000000000011000000111101010011000000110010100000111101100010110