OpenEdv-开源电子网

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

这是怎么回事? 奇葩

[复制链接]

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
发表于 2013-8-31 11:23:38 | 显示全部楼层 |阅读模式
直接上代码:
u8 temp1=0;
u8 temp2=0;
 temp1=0x00;
 temp2=0xff;
 if((temp1==(~temp2))
{

}
else
{
}
经调试追踪 本段代码一直在执行else里边的程序  奇了怪了
我写成
if(1)
{}
else
{}   这样执行if里边的程序 求高手解释!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

1606

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2222
金钱
2222
注册时间
2011-12-15
在线时间
37 小时
发表于 2013-8-31 11:51:38 | 显示全部楼层
将~temp2赋予一个变量,然后让temp1与变量比较,然后测试,看变量的值到底是多少
专业制作STM32 物联网通信模块板,模块交流群:369840039。
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-8-31 12:13:30 | 显示全部楼层
回复【2楼】ST-FAE-SALE:
---------------------------------
恩啊 我知道原因了 我虽然定义的是u8 但是stm32是32位处理器 0xff取反后 应该是0xffffff00 不是0x00 和编译原理有关 进行强制转换 就好了

对编译原理不熟悉  害死人啊....
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-8-31 12:20:34 | 显示全部楼层
追问一个问题:
STM32 是32位处理器
将局部变量存放在堆栈中,我定义一个u8类型的变量,数据范围是一个字节,但是STM32实际上是按照4个字节处理的(只不过是高三个字节被STM32屏蔽掉),  那么 定义一个int 变量 和定义一个u8 变量 占用的实际内存岂不是相同的? 这样 在局部变量中 u8也不能节省内存啊...??
是不是这样 
高手解释下。。
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-31 12:40:27 | 显示全部楼层
回复【4楼】langwanglx:
---------------------------------
是地,实际内存 就是地址了,地址都是32位的
1-1
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-8-31 12:47:54 | 显示全部楼层
回复【5楼】mygod:
---------------------------------
那么全局变量呢 我定义了一个全局变量的数组 很明显 数组是int型的  和是u8  类型的 编译后所占的内存是不一样的 这个这么解释啊 u8不是也占用了4个字节吗(只是高三个字节被屏蔽掉了而已)。  这个这么解释啊
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-31 12:50:05 | 显示全部楼层
回复【6楼】langwanglx:
---------------------------------
地址都是32位的,但是32位地址存的数据 是不一样的,int 是4个字节,U8 是1个字节,
1-1
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-8-31 13:25:18 | 显示全部楼层
回复【7楼】mygod:
---------------------------------
假如这样 temp[2]={0,1};
如果 temp[0]的地址是 0x2222;
那么 temp[1]的地址应该是0x2223
请问 32处理器来说 地址0x2222和0x2223  是不是相差4个字节 
我用取反操作试了 如果temp[0]=0xff 那么 取反后是 0xffffff00;
但是temp[1]的值仍然是1  所以说 temp[0]的取反 没有影响到temp[1];  虽然地址差一  但是实际在内存中应该相差4个字节。
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-31 13:31:54 | 显示全部楼层
回复【8楼】langwanglx:
---------------------------------
等你C 学好,再来想这个问题
1-1
回复 支持 反对

使用道具 举报

71

主题

183

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
494
金钱
494
注册时间
2013-1-29
在线时间
1 小时
 楼主| 发表于 2013-8-31 13:41:15 | 显示全部楼层
回复【9楼】mygod:
---------------------------------
好吧
回复 支持 反对

使用道具 举报

25

主题

683

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1351
金钱
1351
注册时间
2012-4-25
在线时间
195 小时
发表于 2013-8-31 13:52:56 | 显示全部楼层
回复【10楼】langwanglx:
---------------------------------
取反是一种溢出操作了,和你定义的类型无关,只和当前多少位CPU有关。

你上面 u8 temp 取返的值已经溢出 U8 所能表示了,所以你看到的值 是0xffffff00; 但存在 u8 类型里面  此时值是 0X00
1-1
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-7-13 20:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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