首页 > 解决方案 > 为什么这两个函数不能将十进制转换为二进制(uint8_t)?

问题描述

我有两个函数,据说可以将小数转换为二进制,但是如果小数高于 3,我似乎无法让它们工作(我得到奇怪的负数)。我不能完全理解函数中的代码,因为我才刚刚开始学习 C,但是我希望是否有人能告诉我这些函数是否有效,或者我只是没有做正确的事情,即我应该使用int32_t 类型作为传递给函数的值?

uint8_t dec_to_bin(int decimal){
     int n = decimal, i, j, binno=0,dn;

     dn=n;
     i=1;

      for(j=n;j>0;j=j/2)
       {
        binno=binno+(n%2)*i;
        i=i*10;
        n=n/2;
       }

     return binno;
 }

uint8_t dec_to_bin2(int decimal){
    long long binaryNumber = 0;
    int remainder, i = 1;

    while (decimal!=0){
        remainder = decimal%2;
        decimal /= 2;
        binaryNumber += remainder*i;
        i *= 10;
    }
    return binaryNumber;
}

不幸的是,我无法将二进制数的值找出为 uint_8 类型,因为我在微控制器上执行此操作,并且无法在任何地方调试或打印值(我发布了许多线程询问如何执行此操作,没有运气)。然而,我们提供了另一个功能:

int bin_to_dec(uint64_t binary) {
    int result = 0;
    for ( int i = 7; i >= 0; i-- ) {
        result = result * 10 + ((binary >> i) & 1);
    }
    return result;
}

此函数将二进制数转换回整数,因此我可以使用库函数将其显示在屏幕上(库函数只能显示整数或字符串)。如果我将 10 传递给任一十进制到二进制转换器函数,然后将 uint_8 值从任一函数传递到二进制到十进制转换器并打印到 LCD,我得到 -3110。这应该只是 1010。

标签: cbinarydecimal

解决方案


很抱歉,您的dec_to_binanddec_to_bin2函数毫无意义。把它们丢掉。它们可能——可能——作为教学练习有一点价值。但是,如果您尝试为微控制器编写实际代码以实际执行某些操作,则不需要这些功能,也不需要这些功能。(您还需要了解为什么不需要这些功能。)

问题不在于它们被错误地实施。他们的意图从根本上存在缺陷。

例如,这些函数似乎将整数 5 转换为整数 101,乍一看可能看起来像“十进制到二进制转换”,但事实并非如此。您刚刚将数字 5 转换为数字 101。

让我们以不同的方式来看待这个问题。如果我说

int i = 17;

如果我再打电话

printf("%d\n", i);

正如我所料,我看到打印的值“17”。但我也可以打电话

printf("%x\n", i);

这会以十六进制打印i的值,所以我看到“11”。我只是i从十进制转换为十六进制吗? 不,我没有! 我取了同一个数字“十七”,并以两种不同的方式打印出来:十进制和十六进制。

出于所有实际目的,除非您正在设计程序将在其上运行的实际硬件,否则询问数字存储在哪个基中确实没有意义。像这样的变量int i只是一个数字,一个整数。(当然,在我们内心深处,我们知道它一直以二进制形式存储在传统处理器上。)

将数字显式转换为二进制有意义的唯一情况是,如果您想以人类可读的文本表示形式以二进制形式将其打印出来。在这种情况下,您正在整数转换为字符串。(字符串将由字符'0'和组成'1'。)

因此,如果您想编写一个有意义的十进制到二进制转换器(它实际上是一个任何二进制转换器),要么让它将二进制数打印到屏幕上,要么将它存储在一个字符串中(一个数组字符,或char [])。

如果你在一个要求你写作的课堂上uint8_t dec_to_bin(int decimal)(或者你的老师正在给你这样的功能的例子),我无法帮助你,我担心你注定要失败。这位讲师教你的一半是错误的或严重误导,将严重阻碍你成为一名成功的 C 程序员。当然我不能告诉你哪一半,因为我不知道你还被灌输了什么谎言。祝你好运——你需要它!- 稍后忘记这些虚假事实。


推荐阅读