请教:使用snprintf函数打印32位无符号整形,按照16进制显示
本帖最后由 擦鞋匠 于 2022-12-21 14:58 编辑如题
1、我可以使用16进制显示,但是打印数据只能是16位长度
2、我也可以打印32位无符号整型,但是不能按16进制显示
但是,就是不能打印32位无符号整形,同时按照16进制显示。
因此,特此请教各位,感谢!
备注:我使用msp430f5系列,机器长度16bits,iar环境
本帖最后由 我是一个大白菜 于 2022-12-21 15:39 编辑
uint32_t tmp_num = 0x11223344;
uint8_t buf;
memset(buf,0,sizeof(buf));
snprintf(buf,sizeof(buf),"%08x",tmp_num);
printf("buf :%s\n",buf);
是要这个样子吗? 我是一个大白菜 发表于 2022-12-21 15:25
uint32_t tmp_num = 0x11223344;
uint8_t buf;
(引用自2楼)
感谢阁下指教
查看编译器手册,发现需要在"%#X",需要在"#"和"X"之间添加'l'(小写字母L),这样可以打印32位的数,同时按照16进制显示
但是我还是存在疑惑,详细描述下:
#include <stdio.h>
char buf;
snprintf(buf, 20, "%#010lX", 0UL);
很奇怪,这样会打印"0000000000",而不是"0X00000000" 擦鞋匠 发表于 2022-12-21 15:35
感谢阁下指教
查看编译器手册,发现需要在"%#X",需要在"#"和"X"之间添加'l'(小写字母L),这样可以打 ...
(引用自3楼)
snprintf(buf, 20, "0X%#010lX", 0UL);
这样是不是"0X00000000" 本帖最后由 擦鞋匠 于 2022-12-21 15:52 编辑
我是一个大白菜 发表于 2022-12-21 15:40
snprintf(buf, 20, "0X%#010lX", 0UL);
这样是不是"0X00000000"
(引用自4楼)
这样是可以的的,目前我程序就是按照这种方式实现的。
只是脑海中有如上疑问,很是好奇。
补充:如果使用这种方式的话,应该是snprintf(buf, 20, "0X%#08lX", 0UL); 擦鞋匠 发表于 2022-12-21 15:51
这样是可以的的,目前我程序就是按照这种方式实现的。
只是脑海中有如上疑问,很是好奇。
(引用自5楼)
我自己用一般,snprintf(buf, 20, "%08X", 0UL); 就行,具体原理不是很了解 这函数还没智能到自动在16进制数前自动给你加0X,0X只能作为普通字符自己添加。 我是一个大白菜 发表于 2022-12-21 15:53
我自己用一般,snprintf(buf, 20, "%08X", 0UL); 就行,具体原理不是很了解
(引用自6楼)
因为我用的是16位单片机,不添加'l'的话,默认是16位长度;否则是32位长度。
即:
一般16位单片机,int是16位长度,long是32位长度;
一般32位单片机,int和long都是32位长度,倒是没啥区别。
最后,感谢阁下 liyang121316 发表于 2022-12-21 15:59
这函数还没智能到自动在16进制数前自动给你加0X,0X只能作为普通字符自己添加。 ...
(引用自7楼)
添加'#'后是会自动添加"0X"的,只是当数值是0时,不会自动转换为"0X",这是我的疑问。 %x, %X, %8X, %08X 这些只管打印 uint 型的 HEX 码,大小写取决于 X/x 大小,没有前导的 0x 字符。
所以需要 0x%08X 才能打印出 0x12345678 这样的效果。
再说 l 前缀,这个是指定按 long 位宽处理,即 32bit.
对于 32bit 环境,一般 %08X 就能打印出 uint32_t,相当于 uint = uint32_t;
但 LZ 这个 16bit 环境,显然需要 %08lX 才能打印出 uint32_t,否则只有 16bit.
对于 win32/x64 环境,还有 i64 修饰,用于升级 l 前缀为 uint64_t,形如 %016i64X 这种的(i/I 大小写都可):
t3486784401 发表于 2022-12-21 16:08
%x, %X, %8X, %08X 这些只管打印 uint 型的 HEX 码,大小写取决于 X/x 大小,没有前导的 0x 字符。
所以需 ...
(引用自10楼)
感谢大神不吝赐教! 擦鞋匠 发表于 2022-12-21 15:59
因为我用的是16位单片机,不添加'l'的话,默认是16位长度;否则是32位长度。
即:
一般16位单片机,int是 ...
(引用自8楼)
16位的用的少,我也学到新的知识,感谢 t3486784401 发表于 2022-12-21 16:08
%x, %X, %8X, %08X 这些只管打印 uint 型的 HEX 码,大小写取决于 X/x 大小,没有前导的 0x 字符。
所以需 ...
(引用自10楼)
学到了,感谢分享
页:
[1]