OpenEdv-开源电子网

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

关于32位系统的有符号变量

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-23
在线时间
4 小时
发表于 2018-9-25 10:42:26 | 显示全部楼层 |阅读模式
正常的理解是 unsigned char 是有符号8位 代表数字 -128 +127 ,但是在STM32中 这样测试:
char data=-1;
if(data == -1)
{
printf("this-1")
}
printf("%d",data);
理想中应该是打印: this-1-1;
实际上打印是这样的: 255;
就是说data不等于-1 等于255,后来查资料才明白原来32位系统-1是0xffffffff;
那么能不能这样认为:在32位系统中 char =unsigned char, short = unsigend short,就是在说8位和16都是无符号的?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

756

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4163
金钱
4163
注册时间
2017-10-24
在线时间
251 小时
发表于 2018-9-25 11:14:54 | 显示全部楼层
目测来看应该是,我按照楼主的思想进行了相同的实验,得出了相同的运行结果。

注意到在编译的时候,编译器其实给了我一个警告:
1.png
提示我这里有符号的问题。

另,如果将data的数据类型改为int,就是正常的结果了。
不过我觉得造成这个原因的问题应该是和编译器有关,和目标单片机没有太大关系。

十六进制带我飞。
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-9-25
在线时间
1 小时
发表于 2018-9-25 14:51:23 | 显示全部楼层
本帖最后由 pawpaw 于 2018-9-25 14:52 编辑

VC++6.0的运行结果是this-1-1
QQ截图20180925145236.png
回复 支持 反对

使用道具 举报

3

主题

808

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3879
金钱
3879
注册时间
2017-3-7
在线时间
1692 小时
发表于 2018-9-25 14:54:28 | 显示全部楼层
编译器影响,keil里也有一个地方可以选择是signed还是unsigned,最好定义清楚,防止出现这种错误
回复 支持 反对

使用道具 举报

3

主题

238

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1366
金钱
1366
注册时间
2016-5-26
在线时间
1698 小时
发表于 2018-9-26 12:46:18 | 显示全部楼层
我印象中C语言标准是这样规定的:short、int、long这些,不标明符号的话等同于对应的signed类型;char没有规定是否等同于signed char或unsigned char,取决于具体实现(编译器)。
short、int、signed char、unsigned char这些类型是用来表示数值的,char类型是用来表示字符的,尽量不混用。
淘汰人的从来是工具而不是年龄
嵌入式的冷知识屋 blog.csdn.net/k_o_carnivist
回复 支持 反对

使用道具 举报

35

主题

560

帖子

2

精华

资深版主

Rank: 8Rank: 8

积分
17753
金钱
17753
注册时间
2018-3-3
在线时间
523 小时
发表于 2018-9-26 12:53:20 | 显示全部楼层
负数的储存的方式 是补码形式的 所以范围时-128 +127。-1的补码就是0xffffffff
/*
*
*
*
*
*
*/
回复 支持 反对

使用道具 举报

29

主题

338

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1181
金钱
1181
注册时间
2018-4-13
在线时间
170 小时
发表于 2018-9-26 16:53:09 | 显示全部楼层
可以断定你的编译器设置char为unsigned char了。如果需要char 和数值进行计算最好声明时就手动声明为unsigned char或singned char ,而不是取决于编译器。
回复 支持 反对

使用道具 举报

2

主题

685

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3448
金钱
3448
注册时间
2017-7-4
在线时间
869 小时
发表于 2018-9-27 00:21:03 | 显示全部楼层
MISRA编程标准:char、signed char 只用来存储字符。另外,为了避免不同编译器的影响,应该明确加上signed。
回复 支持 反对

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
22
金钱
22
注册时间
2018-1-23
在线时间
4 小时
 楼主| 发表于 2019-11-26 12:40:15 | 显示全部楼层
本帖最后由 dandan的 于 2019-11-26 12:44 编辑

7楼回答是对的 要想定义char必须在编译器里设置,或者用库文件里的 s8,设置方法: 魔术棒->C/C++->Plain Char is Signed 打钩
回复 支持 反对

使用道具 举报

0

主题

4

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
218
金钱
218
注册时间
2019-11-26
在线时间
3 小时
发表于 2019-11-26 12:44:53 | 显示全部楼层
这样的一般-1要做类型强制转换,如 char data=(char)-1;
回复 支持 反对

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6666
金钱
6666
注册时间
2015-8-25
在线时间
1035 小时
发表于 2019-11-26 15:18:59 | 显示全部楼层
试试用printf("=%ld;\r\n",-1);应该可以打印出来-1
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.
过于执着就会陷入其中,迷失自己,困住自己。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-25 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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