![](/img/trans.png)
[英]C Program To Convert Decimal to Binary - Only Values Under 64 Bits are Accurate
[英]How to convert decimal to binary in 64 bits?
所以我有这个代码
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位等可以正常工作。我在做什么错?
它将十进制转换为二进制,但只能转换为32位。 当我将其更改为64位时,它不起作用(似乎只是将结果从32位加倍)。
问题在这里。
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
相反,您可以使用long long int
,其最小大小为64位,或者使用stdint.h
中的int64_t
(恰好为64位)。 我偏爱在代码中使用显式宽度类型,该类型需要特定的宽度以使其对读者更加明显。
long long int
将%lld
用于scanf
和printf
而int64_t
使用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
问题是您的n&k变量的数据类型。 它们是整数。 使用sizeof(int)检查平台的数据类型大小。
当您更改为64位时,这些变量将无法保存64位值。
HTH!
以下代码是解决问题的一种方法:
#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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.