发新帖我要提问
12
返回列表
打印
[STM32F1]

上午折腾4小时搞明白,一个STM32与51编译器默认强制类型转

[复制链接]
楼主: xlsbz
手机看帖
扫描二维码
随时随地手机跟帖
21
xlsbz|  楼主 | 2013-12-5 19:38 | 只看该作者 回帖奖励 |倒序浏览
i55 发表于 2013-12-5 19:35
蛋疼帮楼主用mingw 4.7.2验证了一下,优化等级-O0,这个代码根本进不去!!!可以确信6楼的说法是错误的。 ...

事实上,我的这个a=a主要就是为了设个断点。判断是否“进入到这里”,就是看能不能停在断点。所以下面说,是因为编译器优化级别太高,把a=a优化没了,这种理解不是我的原意。况且,若优化没了,就没法在这里断点啊!!??

使用特权

评论回复
22
xlsbz|  楼主 | 2013-12-5 19:42 | 只看该作者
i55 发表于 2013-12-5 19:22
楼上耍赖皮,有种别用volatile,不用的话跟楼主结果完全一致就是根本进不去,因为根本就没有代码被生成。 ...


我5年前写的  
https://bbs.21ic.com/forum.php?mod=viewthread&tid=236998
2500下载了  你可以参考一下  

使用特权

评论回复
23
i55| | 2013-12-5 19:46 | 只看该作者
xlsbz 发表于 2013-12-5 19:38
事实上,我的这个a=a主要就是为了设个断点。判断是否“进入到这里”,就是看能不能停在断点。所以下面说 ...

既然你也知道arm和x86的编译器会优化没了,你为什么不对比下c51为什么还没有优化掉呢???原因不就是默认变量时volatile属性吗?

使用特权

评论回复
24
i55| | 2013-12-5 19:47 | 只看该作者
xlsbz 发表于 2013-12-5 19:42
我5年前写的  
https://bbs.21ic.com/forum.php?mod=viewthread&tid=236998
2500下载了  你可以参考一下   ...

我都七八年没摸过C51了,现在看这些垃圾代码都恶心。

使用特权

评论回复
25
渤海三叠浪| | 2013-12-5 19:51 | 只看该作者
i55 发表于 2013-12-5 19:46
既然你也知道arm和x86的编译器会优化没了,你为什么不对比下c51为什么还没有优化掉呢???原因不就是默 ...

我不是都说 我在a=a都设置断点了么??

优化掉了 还有办法 设置断点么?

使用特权

评论回复
26
i55| | 2013-12-5 19:54 | 只看该作者
渤海三叠浪 发表于 2013-12-5 19:51
我不是都说 我在a=a都设置断点了么??

优化掉了 还有办法 设置断点么? ...

我就问你一个问题,为什么C51没有优化掉?你想明白了吗?

使用特权

评论回复
27
渤海三叠浪| | 2013-12-5 19:56 | 只看该作者
i55 发表于 2013-12-5 19:54
我就问你一个问题,为什么C51没有优化掉?你想明白了吗?

你为什么没看见代码就恶心???

想明白了么?

使用特权

评论回复
28
i55| | 2013-12-5 19:59 | 只看该作者
渤海三叠浪 发表于 2013-12-5 19:56
你为什么没看见代码就恶心???

想明白了么?

没见过什么世面的井底之蛙能做出什么样的垃圾出来,我用脚后跟都能想明白。

使用特权

评论回复
评论
渤海三叠浪 2013-12-5 20:03 回复TA
你怎么知道我没见过世面?你脚后跟也能想问题?难道脑袋张在脚底下?那万一哪天踩到。。。就不好了!! 
29
渤海三叠浪| | 2013-12-5 20:01 | 只看该作者
i55 发表于 2013-12-5 19:54
我就问你一个问题,为什么C51没有优化掉?你想明白了吗?

你看看你的空间,前些日子 就就被骂了,看留言了么?
还不吸取教训

使用特权

评论回复
30
i55| | 2013-12-5 20:06 | 只看该作者
渤海三叠浪 发表于 2013-12-5 20:01
你看看你的空间,前些日子 就就被骂了,看留言了么?
还不吸取教训

什么空间不空间的,爷从来不看。另外你要是不讨论主题的问题的话,你就接着在这里撒泼打滚好了,爷没时间陪你,请继续。

使用特权

评论回复
31
渤海三叠浪| | 2013-12-5 20:13 | 只看该作者
i55 发表于 2013-12-5 20:06
什么空间不空间的,爷从来不看。另外你要是不讨论主题的问题的话,你就接着在这里撒泼打滚好了,爷没时间 ...

好的 那我继续了。。
我在楼主位置不都写了么   那个volite不是关键,咱们
咱们讨论的是减法,是类型转换。。。不是普通的类型转换,是减法后的转换或者转换后的减法,

你代码不错 不过字体没有国际范 是不是楷体啊?
格式不错 但是该套括号的地方没有套  你继续

你继续。。

使用特权

评论回复
32
kseeker| | 2013-12-5 20:50 | 只看该作者
别管那两个人了,基本上就会骂人。

使用特权

评论回复
33
kseeker| | 2013-12-5 20:57 | 只看该作者
本帖最后由 kseeker 于 2013-12-5 20:59 编辑

        unsigned short a = 10;
        unsigned short b = 12;
        int i = (a - b > 3) ? 1 : 0;
        int j = (unsigned short)(a - b) > 3 ? 1 : 0;
        int m = a - b;
        unsigned short n = a - b;
运行的结果, i = 0, j = 1. m = -2, n = 65534.

使用特权

评论回复
34
kseeker| | 2013-12-5 21:12 | 只看该作者
另一个实验:虽然是C++的,但原理是相同的:
int fun(unsigned short v)
{
        return 1;
}
int fun(int v)
{
        return 2;
}

int x = fun(a);  // x = 1
int y = fun(a - b); // y = 2

使用特权

评论回复
35
m__dd| | 2013-12-6 08:17 | 只看该作者
按我的理解,编译器和C标准都不应该让程序进入这里:a = a;
这样和我们平时的数**算符合,不用绕弯。不然编译器和C标准就是在挖坑,违背我们的数学习惯。

使用特权

评论回复
36
lhchen922| | 2013-12-6 12:56 | 只看该作者
赞同 #13楼的说法,,和#21楼的说法,,如果代码优化了,,断点都不能加的。。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则