C程序将十进制转换为二进制-只有64位以下的值才是准确的

时间:2018-08-22 22:30:14

标签: c binary

我创建了一个小型的初学者程序,该程序将十进制值转换为二进制。但是,只有最多32位的十进制值才能正确打印。

#include <stdio.h>

#define EIGHT_BITS 255
#define SIXTEEN_BITS 65535
#define THIRTY_TWO_BITS 4294967295UL
#define SIXTY_FOUR_BITS 18446744073709551615ULL

int main() {
 static int b[64];
 int l, r;
 unsigned long long d;

 scanf("%d", &d);

 // determines number of bits to output
 if (d <= EIGHT_BITS) {
      l = 8;
      printf("8bits\n");
 }
 else if (d > EIGHT_BITS && d <= SIXTEEN_BITS) {
      l = 16;
      printf("16bits\n");
 }
 else if (d > SIXTEEN_BITS && d <= THIRTY_TWO_BITS) {
      l = 32;
      printf("32bits\n");
 }
 else if (d > THIRTY_TWO_BITS && d <= SIXTY_FOUR_BITS) {
      l = 64;
      printf("64bits\n");
 }

 // creates array
 for (int i = 0; i < l; i++) {
      r = d % 2;
      d /= 2;
      b[i] = r;
 }

 // reverses array for binary value
 for (int j = l - 1; j >= 0; j--) {
      printf("%d", b[j]);
 }

 return 0;
}

当我输入不超过64位长无符号长整数的各种十进制值时,将使用相应的二进制值打印十进制。但是,数字介于32位值和64位值之间。

当我将“ d”定义为“ unsigned long long”时,我会收到准确的32位值,但是当我将类型更改为“ unsigned long long”以容纳更大的数字时,则不再有8位,16位和32位值准确,也不是64位值。

这是我的输出:

// correct
>> 357
     16bits
     0000000101100101

// correct
>> 4294967295
     32bits
     11111111111111111111111111111111

// incorrect
>> 18446744073709551615
     64bits
 0000000001000000000110100110111011111111111111111111111111111111

1 个答案:

答案 0 :(得分:4)

问题出在这里

 scanf("%d", &d);

d的类型为unsigned long long,但是您使用的是%d,它需要int的地址。使用错误的格式说明符会调用undefined behavior

unsigned long long的正确格式说明符是%llu

 scanf("%llu", &d);
相关问题