C中的二进制到十进制转换器在某个数字后不起作用
Posted
技术标签:
【中文标题】C中的二进制到十进制转换器在某个数字后不起作用【英文标题】:Binary to decimal converter in C doesn't work after a certain number 【发布时间】:2020-07-06 14:51:18 【问题描述】:我尝试使用 C 制作正二进制到十进制数字转换器,但是当我尝试输入高于 1110011010110001010111(十进制为 3779671)的值时,程序总是返回该确切数字。我当前的任务要求它适用于最多 111111111111111111111111111111 (1073741823) 的二进制数。
到目前为止,我已经尝试将变量类型更改为任何其他可能的更大尺寸,但它似乎不起作用。这是当前代码:
#include <math.h>
void main()
unsigned long long int bi, de = 0;
unsigned long long int x = 0, bases;
scanf("%llu", &bi);
for(x=0 ; bi>0 ; x++, bi=bi/10)
bases = bi % 10;
de = de + bases * pow(2,x);
printf("%llu", de); // imprime o correspondente em decimal
提前感谢您的帮助。
【问题讨论】:
long long int
的最大值为18,446,744,073,709,551,615
您没有将二进制值作为字符串读取 - 您正在将其读取为数字为 1 和 0 的数字,但 long long int 具有它可以容纳的最大数字。而是将二进制值作为字符串读取,它将起作用。
啊,明白了,非常感谢!您对如何在字符串上进行整个数学过程有什么建议吗?我想我必须以不同的方式重做,因为我认为我不能只在字符串上使用“%”和“/”运算符。
我会回答的...
@Barmar 也许不是maximum value of a long long int is 18,... 看起来像unsigned long long
的常见最大值。
【参考方案1】:
您不需要所有的索引和添加。您可以简单地从右侧移入位:
#include <stdio.h>
#include <string.h>
unsigned long long int bin2dec(const char *string)
unsigned long long int value = 0;
while (*string != '\0')
// make room for the next bit by shifting what is there already
value <<= 1;
// *string != '0' gives 1 if the current character is not '0', else 0
value |= *string != '0';
string++;
return value;
int main(void)
// 7 F C F F 4 F A F F F
const char * binary = "1111111110011111111010011111010111111111111";
unsigned long long int decimal = bin2dec(binary);
printf("%llX\n", decimal);
return 0;
【讨论】:
【参考方案2】:无法读取二进制数 111111111111111111111111111111 并将其放入 unsigned long long 整数中,因为 unsigned long long int 的限制为 18446744073709551615,因此您需要将二进制数读取为字符串,然后将每个字符串转换字符改为数字:
#include <stdio.h>
#include <string.h>
#include <math.h>
unsigned long long int bin2dec(const char *string, const size_t size)
unsigned long long int bit, value = 0;
for(size_t index=0;index<size;index++)
// moving from the end to the beginning, get a character from the string
// and convert it from a character containing a digit to a number
bit = string[size-index-1]-'0';
// in the original question this was: value += bit*pow(2,index);
// but we can just do this and get the same effect
// without multiplication or library function
value += bit<<index;
return value;
int main()
const char * binary = "111111111111111111111111111111";
unsigned long long int decimal = bin2dec(binary, strlen(binary));
printf("%llu\n",decimal);
return 0;
在这里试试:https://onlinegdb.com/Skh7XKYUU
【讨论】:
unsigned range
上方的“二进制”代码失败。要使用 unsigned long long
范围,请使用 unsigned long long bit
。
@chux-ReinstateMonica 变量 bit
只是字符串中的一个字符,因此它可以是整数 0 或 1。我不明白为什么它需要比 short
更宽
如果bit<<index
中的index
大于或等于8 * sizeof bit
,则结果为0。E1 << E2
上的C17 标准6.5.7:“如果E1 具有带符号类型和非负值,并且 E1 * 2^E2 在结果类型中是可表示的,那么这就是结果值;否则,行为是未定义的。”用一些更大的输入试试你的程序。
另外,你为什么不从右边逐位移动到结果中呢?
@thebusybee 好的,等等 - 所以我真的不明白为什么它应该这样工作的原因,但你是对的 const char * binary = "111111111111111111111111111111";
返回 0 所以我需要改变它。以上是关于C中的二进制到十进制转换器在某个数字后不起作用的主要内容,如果未能解决你的问题,请参考以下文章