【发布时间】:2021-11-16 19:34:42
【问题描述】:
我编写了这个程序,将二进制数传递给函数并打印该二进制数的十进制值。问题是如果二进制数变大(如 11 个数字),该函数会打印完全不同的东西。我现在尝试解决了几个小时,但没有任何效果。
所以我的问题是:如何更改我的程序,以便在二进制数变大的情况下打印正确的十进制数?
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdint.h>
int int_log2_64(uint64_t x) { return 63 ^ __builtin_clzll(x); }
#define K(T) (((sizeof(#T) - 1) << 32) - T)
int digit_count(uint32_t x)
{
static uint64_t table[] = {
K(0), K(0), K(0),
K(10), K(10), K(10), // 64
K(100), K(100), K(100), // 512
K(1000), K(1000), K(1000), // 4096
K(10000), K(10000), K(10000), // 32k
K(100000), K(100000), K(100000), // 256k
K(1000000), K(1000000), K(1000000), // 2048k
K(10000000), K(10000000), K(10000000), // 16M
K(100000000), K(100000000), K(100000000), // 128M
K(1000000000), K(1000000000), K(1000000000), // 1024M
K(1000000000), K(1000000000) // 4B
};
int lg2 = int_log2_64(x);
uint64_t n = (uint64_t)(x) + table[lg2];
return n >> 32;
}
void binaryToDecimal(long long int bin)
{
int l = digit_count(bin);
char str[l];
itoa(bin, str, 10);
float sum[l];
int x = l - 1;
float answer;
for (int i = 0; i < l; i++)
{
if (str[i] == '1')
{
sum[i] = pow(2, x);
}
x--;
}
for (int i = 0; i < l; i++)
{
answer = answer + sum[i];
}
printf("%.0f", answer);
}
int main()
{
long long int bin = 10101101101;
binaryToDecimal(bin);
}
附:我把代码改成了这个,它可以工作
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
void binaryToDecimal(char *bin)
{
int l = strlen(bin);
int x = l - 1;
float sum[l];
float answer = 0;
for (int i = 0; i < l; i++)
{
if (bin[i] == '1')
answer += pow(2, x);
else
sum[i] = 0;
x--;
}
printf("%.0f", answer);
}
int main()
{
binaryToDecimal("010101101101");
}
【问题讨论】:
-
你想让
binaryToDecimal(100)返回4吗?您是否意识到您可以用 64 位表示的最大int是18446744073709551615(9223372036854775807,如果已签名)? -
另外,
itoa()(不在标准中,不在 POSIX 中)将int作为第一个参数。您正在使用long long int,它可能会被转换为警告。打开所有编译器警告。 注意警告。 -
最大无符号 32 位整数是
4294967295,有符号 32 位整数是2147483647。 -
除了使用
itoa和使用float的所有问题之外,char str[l]太短了,因为它没有空间容纳空终止符(也没有空间容纳可能导致的减号将long long int转换为int时算术溢出)。另外,answer还没有被初始化。 -
@hasan
void binaryToDecimal(long long int bin)。输入参数应该是一个字符串而不是long long int