擦鞋匠 发表于 2022-12-21 14:55:55

请教:使用snprintf函数打印32位无符号整形,按照16进制显示

本帖最后由 擦鞋匠 于 2022-12-21 14:58 编辑

如题
1、我可以使用16进制显示,但是打印数据只能是16位长度
2、我也可以打印32位无符号整型,但是不能按16进制显示

但是,就是不能打印32位无符号整形,同时按照16进制显示。
因此,特此请教各位,感谢!

备注:我使用msp430f5系列,机器长度16bits,iar环境

我是一个大白菜 发表于 2022-12-21 15:25:29

本帖最后由 我是一个大白菜 于 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:35:48

我是一个大白菜 发表于 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:40:57

擦鞋匠 发表于 2022-12-21 15:35
感谢阁下指教

查看编译器手册,发现需要在"%#X",需要在"#"和"X"之间添加'l'(小写字母L),这样可以打 ...
(引用自3楼)

snprintf(buf, 20, "0X%#010lX", 0UL);
这样是不是"0X00000000"

擦鞋匠 发表于 2022-12-21 15:51:09

本帖最后由 擦鞋匠 于 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:53:26

擦鞋匠 发表于 2022-12-21 15:51
这样是可以的的,目前我程序就是按照这种方式实现的。
只是脑海中有如上疑问,很是好奇。

(引用自5楼)

我自己用一般,snprintf(buf, 20, "%08X", 0UL); 就行,具体原理不是很了解

liyang121316 发表于 2022-12-21 15:59:11

这函数还没智能到自动在16进制数前自动给你加0X,0X只能作为普通字符自己添加。

擦鞋匠 发表于 2022-12-21 15:59:24

我是一个大白菜 发表于 2022-12-21 15:53
我自己用一般,snprintf(buf, 20, "%08X", 0UL); 就行,具体原理不是很了解
(引用自6楼)

因为我用的是16位单片机,不添加'l'的话,默认是16位长度;否则是32位长度。
即:
一般16位单片机,int是16位长度,long是32位长度;
一般32位单片机,int和long都是32位长度,倒是没啥区别。

最后,感谢阁下

擦鞋匠 发表于 2022-12-21 16:01:49

liyang121316 发表于 2022-12-21 15:59
这函数还没智能到自动在16进制数前自动给你加0X,0X只能作为普通字符自己添加。 ...
(引用自7楼)

添加'#'后是会自动添加"0X"的,只是当数值是0时,不会自动转换为"0X",这是我的疑问。

t3486784401 发表于 2022-12-21 16:08:04

%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 大小写都可):

擦鞋匠 发表于 2022-12-21 16:10:46

t3486784401 发表于 2022-12-21 16:08
%x, %X, %8X, %08X 这些只管打印 uint 型的 HEX 码,大小写取决于 X/x 大小,没有前导的 0x 字符。
所以需 ...
(引用自10楼)

感谢大神不吝赐教!

我是一个大白菜 发表于 2022-12-21 18:03:43

擦鞋匠 发表于 2022-12-21 15:59
因为我用的是16位单片机,不添加'l'的话,默认是16位长度;否则是32位长度。
即:
一般16位单片机,int是 ...
(引用自8楼)

16位的用的少,我也学到新的知识,感谢

我是一个大白菜 发表于 2022-12-21 18:05:24

t3486784401 发表于 2022-12-21 16:08
%x, %X, %8X, %08X 这些只管打印 uint 型的 HEX 码,大小写取决于 X/x 大小,没有前导的 0x 字符。
所以需 ...
(引用自10楼)

学到了,感谢分享
页: [1]
查看完整版本: 请教:使用snprintf函数打印32位无符号整形,按照16进制显示