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

2019-07-21 02:49发布

现象

程序1

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

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

程序2

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

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

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

疑问

为什么printf打印char变量时,打印不了负值,会转为正值?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
磨剑
1楼-- · 2019-07-21 22:44
 精彩回答 2  元偷偷看……
Theone
2楼-- · 2019-07-22 02:20
回复【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输出 这样就是正确的结果 懂了么?
STM32VBT6
3楼-- · 2019-07-22 05:22
回复【7楼】Theone:
---------------------------------
说错了。是signed
STM32VBT6
4楼-- · 2019-07-22 07:34
回复【9楼】Theone:
---------------------------------
不是这个原因,你按我的试下就知道了。
磨剑
5楼-- · 2019-07-22 11:33
回复【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。网上也能搜索到。
chenrj
6楼-- · 2019-07-22 16:22
 精彩回答 2  元偷偷看……

一周热门 更多>