所以我有这个代码
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 位等。我做错了什么?
It converts decimal into binary but only in 32 bits. When I change it into 64 bits it doesn't work (it seems like it just doubles the result from 32 bits).
问题就在这里
int n, c, k;
printf("Enter an integer\n");
scanf("%d", &n);
n
是一个 int
,可以小到 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
相反,您可以使用最小大小为 64 位的 long long int
或来自 stdint.h
的 int64_t
正好是 64 位。我更喜欢在需要特定宽度的代码中使用显式宽度类型,以使其对读者更明显。
long long int
使用 %lld
用于 scanf
和 printf
而 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
我是一名优秀的程序员,十分优秀!