我创建了一个小型的初学者程序,该程序将十进制值转换为二进制。但是,只有最多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
答案 0 :(得分:4)
问题出在这里
scanf("%d", &d);
d
的类型为unsigned long long
,但是您使用的是%d
,它需要int
的地址。使用错误的格式说明符会调用undefined behavior。
unsigned long long
的正确格式说明符是%llu
:
scanf("%llu", &d);