OpenEdv-开源电子网

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

请教一个在MDK环境下关于printf的奇怪问题

[复制链接]

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
发表于 2015-5-20 09:02:42 | 显示全部楼层 |阅读模式
5金钱

现象

程序1

char abc = -123;
printf("magic number = %d \n", -123);
printf("abc = %d \n", abc);

打印结果:
magic number = -123
abc = 133

程序2

short abc = -123;
printf("magic number = %d \n", -123);

printf("abc = %d \n", abc);

打印结果:
magic number = -123
abc = -123

疑问

为什么printf打印char变量时,打印不了负值,会转为正值?

最佳答案

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

偷偷地告诉你,MDK中char默认为unsigned类型(这是一个与众不同之处),故-123会有警告,要转换成正数133. 你把abc定义成signed char就可以得到你想要的结果啦~~~~~~
持续而安静地投入
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-5-20 09:02:43 | 显示全部楼层
偷偷地告诉你,MDK中char默认为unsigned类型(这是一个与众不同之处),故-123会有警告,要转换成正数133.
你把abc定义成signed char就可以得到你想要的结果啦~~~~~~
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-5-20 09:17:02 | 显示全部楼层
-123 
单字节是 1000 0101

输出%d应该是弄成int类型了

所以是 0000 0000 1000 0101

这样就是133了
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-5-20 09:18:14 | 显示全部楼层
你可以试试输出的时候这样

printf("abc= %d \n", (int)abc);
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
 楼主| 发表于 2015-5-20 09:46:47 | 显示全部楼层
回复【2楼】Theone:
---------------------------------
char a = -123;
int b = a;
b的值是a转换成int类型后的值,按照你的意思 b = 133 ?
持续而安静地投入
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
 楼主| 发表于 2015-5-20 09:50:26 | 显示全部楼层
回复【2楼】Theone:
---------------------------------
你看程序2,abc是short,为什么它能正确打印?按照你说的char转换成int的做法,那short转换成int时,应该也是一样的,-123就变成133了
持续而安静地投入
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-5-20 11:16:15 | 显示全部楼层
回复【6楼】STM32VBT6:
---------------------------------
你把abc定义成无符号的 怎么能出来负数?
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
 楼主| 发表于 2015-5-20 11:17:22 | 显示全部楼层
回复【6楼】STM32VBT6:
---------------------------------
正解,非常感谢,高手!

signed char abc = -123;
printf("abc = %d", abc);

这样就可以正常打印了。
原来mdk的char 不是signed char 而是unsigned char。
持续而安静地投入
回复

使用道具 举报

42

主题

358

帖子

0

精华

高级会员

Rank: 4

积分
889
金钱
889
注册时间
2014-8-16
在线时间
193 小时
发表于 2015-5-20 11:26:14 | 显示全部楼层
回复【4楼】磨剑:
---------------------------------
第一个问题 
b还是-123
第二个问题
abc为short时 为双字节!!
char是一个字节!!

short跟int是一个数据类型 都是双字节!!

char强转为int符号位是要变位置的!!

char的-123 为1000 0101
int的-123为1000 0000 0000 0101

你输出错误是因为printf把你的char 1000 0101
转换为了 int 0000 0000 1000 0101   

如果 你把你的char 1000 0101
强转int 那就成了1000 0000 0000 0101

然后在%d输出 这样就是正确的结果 懂了么?
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-5-20 11:56:53 | 显示全部楼层
回复【7楼】Theone:
---------------------------------
说错了。是signed
回复

使用道具 举报

17

主题

342

帖子

0

精华

高级会员

Rank: 4

积分
544
金钱
544
注册时间
2014-4-24
在线时间
20 小时
发表于 2015-5-20 11:59:26 | 显示全部楼层
回复【9楼】Theone:
---------------------------------
不是这个原因,你按我的试下就知道了。
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
 楼主| 发表于 2015-5-20 12:42:01 | 显示全部楼层
回复【9楼】Theone:
---------------------------------
1,我的芯片是stm32F4,int是32位的。
2,就算int是16位的,一个有符号char值,强制转换成有符号int值,也不会改变其符号位的,负的还是负的,正的还是正的。
3,char a = -123;int b = a;这里也是把char型a,强制转换为int型赋值给b。
4,你测试下就知道了,mdk里面的char默认类型是unsigned char。网上也能搜索到。
持续而安静地投入
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2015-5-21
在线时间
14 小时
发表于 2015-5-22 22:35:43 | 显示全部楼层
这个问题我也遇到了,一直以为char 是带符号的, unsigned char才是不带符号的 ,直到今天才明白,char是否带符号其实是可选的,MDK编译器有个选项“plain char is signed”就是关于这个的,看下面这个贴子你就明白了。
http://www.openedv.com/posts/list/52702.htm
回复

使用道具 举报

12

主题

71

帖子

0

精华

初级会员

Rank: 2

积分
157
金钱
157
注册时间
2015-1-28
在线时间
8 小时
 楼主| 发表于 2015-5-24 13:49:43 | 显示全部楼层
回复【13楼】chenrj:
---------------------------------
谢谢提醒!!明白了
持续而安静地投入
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 18:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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