OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3547|回复: 13

char型负值,为什么用snprintf函数不能正确输出负值?

[复制链接]

102

主题

318

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1876
金钱
1876
注册时间
2011-12-21
在线时间
545 小时
发表于 2018-9-10 10:13:10 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 玻璃之城2046 于 2018-9-11 08:47 编辑

如题,在keil里定义一个char型数据,赋值为-5:char ctemp=-5  然后用snprintf转换为字符串,输出为251,而不是负值,为什么会这样呢?
QQ截图20180910101131.png
QQ截图20180910101252.png

最佳答案

查看完整内容[请看2#楼]

感谢诸位!换成signed char 就可以了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

102

主题

318

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1876
金钱
1876
注册时间
2011-12-21
在线时间
545 小时
 楼主| 发表于 2018-9-10 10:13:11 | 显示全部楼层
感谢诸位!换成signed char  就可以了
QQ截图20180911084706.png
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-9-10 10:45:31 | 显示全部楼层
这是串口的事,不是snprintf的事
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-9-10 10:48:01 | 显示全部楼层
-5在内存中二进制的表示就是251的二进制
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

102

主题

318

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1876
金钱
1876
注册时间
2011-12-21
在线时间
545 小时
 楼主| 发表于 2018-9-10 11:11:02 | 显示全部楼层
szczyb1314 发表于 2018-9-10 10:48
-5在内存中二进制的表示就是251的二进制

道理我都明白,但是int型可以输出负值啊,而且我的写法网上也有的
QQ截图20180910111030.png
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-9-10 11:27:23 | 显示全部楼层
你的上图printf是在PC上用的,不是MCU
你的串口不知道他是负数啊,串口助手全当正数处理了
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-9-10 12:30:49 | 显示全部楼层
char 就是不行,应该是被c 隐式强制类型转好了,有符号强制转换为无符号数了
did-type-change.jpg
He who fights with monsters should look to it that he himself does not become a monster, when you gaze long into the abyss, the abyss also gazes into you.
过于执着就会陷入其中,迷失自己,困住自己。
回复

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2018-9-10 12:56:25 来自手机 | 显示全部楼层
C语言规定char这个类型就是用来存字符的,不应该用来存数值;如果你想存一个(占用空间比较小的)数值,应该用signed char或者unsigned char。
回复

使用道具 举报

3

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
907
金钱
907
注册时间
2011-10-19
在线时间
196 小时
发表于 2018-9-10 20:38:13 | 显示全部楼层
本帖最后由 ufbycd 于 2018-9-10 20:54 编辑

Screenshot_20180910_203408.png unsigned char按%d打印就是251. Keil或IAR编译器有个选项选择是否将char型当成unsigned char



回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-9-11 01:57:20 | 显示全部楼层
想要看结果,直接printf
别用你那个。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-11 08:16:23 | 显示全部楼层
8楼正解。

楼主可以试试将其定义改为
signed char temp;
然后再尝试一下。
十六进制带我飞。
回复

使用道具 举报

1

主题

35

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
318
金钱
318
注册时间
2016-10-17
在线时间
98 小时
发表于 2018-9-11 08:28:55 | 显示全部楼层
8楼正解,KEIL有个选项,默认情况下char为unsinged char
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2018-9-11 08:40:30 | 显示全部楼层
回复

使用道具 举报

33

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2036
金钱
2036
注册时间
2017-12-11
在线时间
454 小时
发表于 2018-9-11 08:53:12 | 显示全部楼层
char 一定是signed char吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 07:15

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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