搜索
bottom↓
回复: 12

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

[复制链接]

出0入0汤圆

发表于 2022-12-21 14:55:55 | 显示全部楼层 |阅读模式
本帖最后由 擦鞋匠 于 2022-12-21 14:58 编辑

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

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

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

出0入42汤圆

发表于 2022-12-21 15:25:29 | 显示全部楼层
本帖最后由 我是一个大白菜 于 2022-12-21 15:39 编辑

uint32_t tmp_num = 0x11223344;
uint8_t   buf[16];

memset(buf,0,sizeof(buf));
snprintf(buf,sizeof(buf),"%08x",tmp_num);
printf("buf :%s\n",buf);

是要这个样子吗?

出0入0汤圆

 楼主| 发表于 2022-12-21 15:35:48 | 显示全部楼层
我是一个大白菜 发表于 2022-12-21 15:25
uint32_t tmp_num = 0x11223344;
uint8_t   buf[16];

(引用自2楼)

感谢阁下指教

查看编译器手册,发现需要在"%#X",需要在"#"和"X"之间添加'l'(小写字母L),这样可以打印32位的数,同时按照16进制显示

但是我还是存在疑惑,详细描述下:
#include <stdio.h>
char buf[20];
snprintf(buf, 20, "%#010lX", 0UL);
很奇怪,这样会打印"0000000000",而不是"0X00000000"

出0入42汤圆

发表于 2022-12-21 15:40:57 | 显示全部楼层
擦鞋匠 发表于 2022-12-21 15:35
感谢阁下指教

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

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

出0入0汤圆

 楼主| 发表于 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);

出0入42汤圆

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

(引用自5楼)

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

出0入42汤圆

发表于 2022-12-21 15:59:11 | 显示全部楼层
这函数还没智能到自动在16进制数前自动给你加0X,0X只能作为普通字符自己添加。

出0入0汤圆

 楼主| 发表于 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位长度,倒是没啥区别。

最后,感谢阁下

出0入0汤圆

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

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

出200入2554汤圆

发表于 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 大小写都可):

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

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

感谢大神不吝赐教!

出0入42汤圆

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

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

出0入42汤圆

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

学到了,感谢分享
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-4 03:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表