【问题标题】:binary to decimal conversion in cc中的二进制到十进制转换
【发布时间】:2015-07-20 07:32:35
【问题描述】:

下面是我将二进制转换为十进制的代码,但我怀疑当我将数据输入为 100000 时,它会给出准确的答案。超出整数范围如何给出正确答案?

int main()
{int rem,deci=0,a=1,b;
int bin;

printf("size of int :- %d",sizeof(int));

printf("enter the binary value");
scanf("%d",&bin);
while(bin!=0)
{
    rem=bin%10;
    deci=deci+rem*a;
    a=a*2;
    bin=bin/10;
}
printf("%d \n",deci);
}

【问题讨论】:

  • 这个程序的预期和实际输出是什么?
  • 100000 并没有超出int 的范围,在当今几乎所有的架构/实现中。除非您看到打印了 size of int :- 2 行,否则您也不是这种情况。
  • 它在这里工作。问题出在哪里?
  • sizeof returns a size_t and must be printed with %zu。以错误的格式打印会引发未定义的行为。
  • 这并不是真正的二进制到十进制转换......如果你想要这样的转换,你应该读取一个字符串(例如fgets),而不是一些int 变量bin ,

标签: c


【解决方案1】:

您的代码的主要问题是您将二进制值作为整数读取,然后对其进行操作。

scanf("%d",&bin);

这会读取整数的十进制表示并将其存储在bin 中。所以如果你输入“100000”,那么bin会保存十进制值100000。

由于scanf 没有读取二进制的选项,您需要做的是将用户输入作为字符串读取,然后检查每个字符以查看它是“0”还是“1”并根据将正确的值添加到deci

【讨论】:

  • @ravi-s 这回答了你的问题吗?
【解决方案2】:

要知道您的实现中int 范围内的最大值,
请检查标准头 limits.h 中定义的常量 INT_MAX 的值。

<limits.h>
<stdio.h>
int main(void)
{
     printf("Max. value: %d\n", INT_MAX);
}  

此外,您还可以获得有关其他整数类型限制的信息。示例:

printf("%ld", LONG_MAX); // For the maximum value of signed long      
printf("%lu", ULONG_MAX); // For the maximum value of unsigned long

【讨论】:

    【解决方案3】:

    更新 谢谢Lưu Vĩnh Phúc

    int 的最大可接受范围是 4 个字节,最高可达 2147483647。 您将短类型(–32,768 到 32,767)与 int 类型(–2,147,483,648 到 2,147,483,647)混淆了

    Interger Type

    整数下面有很多种类型,你可以通过这篇文章了解更多:Data Type Ranges

    您可以使用以下语句声明不同的 int 类型:

     __int16 x = 16;
     __int32 x = 32;
     __int64 x = 64;
    

    检查 int64 类型 whoof!

    【讨论】:

    • 错误。 MSVC 和我认识的所有编译器都不会改变 int 的大小。在整个编译过程中大小必须一致
    • 我猜我打错了洞的方式。谢谢 Lu “如果一个值超过了最大整数表示,Microsoft 编译器会产生错误。”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-09
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    相关资源
    最近更新 更多