【发布时间】:2018-03-15 14:13:23
【问题描述】:
我正在使用 netBean 编写 C 代码,我的任务是将一个非常大的二进制数转换为十进制(二进制数可能高达 100 位),我很困惑,因为我的程序在二进制数约为 50 时工作-60 位,但当输入较大时,它会在运行时自动崩溃。我正在使用 long long int 来存储十进制结果,但它似乎不起作用! 这是我的代码:
long long int decimal = 0;
int position = 0;
for(int i = strlen(binaryInput)-1; i>=0; --i){
if(binaryInput[i]=='1'){
decimal += (long long int)(pow(2,position));
}
++position;
}
printf("\nDecimal number is: %lli ", decimal);
'binaryInput' 是我从键盘存储 binaryNumber 的字符串。
【问题讨论】:
-
long long int类型至少为 64 位。并签字。那么,如果它只有 64 位(现代 PC 系统的标准),你怎么能在其中容纳多达 100 位的数据呢? -
为什么不使用移位运算符?会比反复使用
pow快很多 -
pow()在这里是个坏主意,它对浮点数进行操作。请改用简单的位移。然后,在典型的 C 实现中没有可以容纳 100 位(二进制数字!)的整数类型。您可以尝试使用非标准的int128_t类型。您可能应该改用一组无符号类型。将其转换为十进制表示法,看看例如在double dabble algorithm。 -
你能把数字显示为十六进制吗?如果是这样,您可以翻译任意数量的二进制数字。一次只取 4 位并将它们转换为十六进制。
-
首先,您需要选择一个能够保持所需结果的内部表示。这意味着一些非常 big 的 int 类型,大小至少为 100 位(
long long没有填满)。或者可能是一个 ASCII 表示形式的数组char-s...?