C语言无库使用printf()及Teensy变量存储显示问题咨询
咱们得先搞清楚,printf本质上是把格式化后的字符串输出到标准输出(比如控制台或者串口),标准库帮我们封装了格式化和底层输出的逻辑。要是完全不用库的话,就得自己把这两块活儿干了:
针对带操作系统的环境(比如Linux):
printf最终会通过系统调用把数据写到标准输出文件描述符(通常是1)。你可以自己实现一个简单的格式化函数,把要输出的内容转成字符串,然后直接调用系统调用syscall(SYS_write, 1, buffer, len)来输出。比如要输出整数,你得自己写代码把整数转成十进制/十六进制字符串,处理%c、%s这些基础格式符——毕竟标准库的格式化逻辑你没法用了。针对裸机/嵌入式环境(比如你用的Teensy):
这里没有操作系统,printf一般是通过串口输出的。你可以直接操作Teensy的串口寄存器来发送字符,然后自己实现一个类似printf的函数(比如叫my_printf)。举个例子,先查Teensy的 datasheet找到串口发送数据的寄存器,然后写一个函数把字符串逐字节写入这个寄存器,再加上格式化逻辑(比如把整数转成字符序列),就能实现类似printf的功能了。
要注意哦,完全不依赖库的话,所有的辅助逻辑(比如字符串反转、数字转字符)都得自己写,不能用stdlib里的任何函数。
这个问题的核心其实是数值的存储和表示的区别,咱们一步步说:
存储层面:
不管你用0x3F还是63初始化Contrast,它在内存里的存储是完全一样的!因为0x3F转换成十进制就是63,对应的二进制都是00111111。预编译的时候LCD_DEFAULT_CONTRAST会被替换成0x3F,编译器会把这个十六进制数转换成二进制值,存在Contrast变量的内存地址里——和直接写63没有任何区别。显示层面:
它显示成63还是0x3F,完全取决于你用什么方式输出:- 用
printf("%d", Contrast),就会显示十进制的63; - 用
printf("%x", Contrast),会显示十六进制的小写3f,用printf("%X", Contrast)则是大写3F; - 要是在调试器里看变量,一般可以切换显示格式(十进制、十六进制、二进制),这些都是同一个二进制值的不同“外衣”而已。
- 用
互换性:
这两种表示在代码里是完全可以互换的!不管是初始化变量还是后续赋值,Contrast = 63;和Contrast = 0x3F;的效果100%一致,不管是存储还是参与计算,都没有任何区别——因为它们本质上是同一个数值的不同写法。
内容的提问来源于stack exchange,提问作者david_10001

