c - 为什么这两个函数不能将十进制转换为二进制(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。
解决方案
很抱歉,您的dec_to_bin
anddec_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 程序员。当然我不能告诉你哪一半,因为我不知道你还被灌输了什么谎言。祝你好运——你需要它!- 稍后忘记这些虚假事实。
推荐阅读
- ios - 从 Tableview 中的 CollectionCell 执行 segue
- timer - ESP32 Arduino:BluetoothSerial.h 的 .println() 破坏了其他内核上的硬件定时器中断
- tensorflow - ImportError:python39.dll 的模块使用与此版本的 Python 冲突
- php - 如何在输入框中的 PHP 中添加空格?
- pdf - 如何引用预格式化 PDF (QDF) 中的文本内容?
- c# - 在 Android 和 iOS 上点击自定义按钮时实现“突出显示效果”而不是“涟漪效果”
- swift - 使用 void* 访问 MTLBuffer 内容
- javascript - 如何仅在按钮显示特定文本时才显示弹出窗口
- javascript - caches.delete 没有删除任何内容
- ios - 为 AARCH64 iOS Darwin 执行程序集 Shellcode