打印

MD,highgear绝对是故意的,我都已经**过一次了

[复制链接]
楼主: 刘前辈
手机看帖
扫描二维码
随时随地手机跟帖
21
computer00| | 2009-4-16 11:33 | 只看该作者 回帖奖励 |倒序浏览

很少见(char)i=xx这样的写法……

编译器应该是把它理解成了

*((char *)&i)=xx

了,结果就是((char *)&i)[0]=xx

使用特权

评论回复
22
xwj| | 2009-4-16 12:23 | 只看该作者

20楼的写法,换个编译器或IC可就够呛了

使用特权

评论回复
23
icecut| | 2009-4-16 17:40 | 只看该作者

其实前面2种已经优化了.

如果你算k*255+b,就没那么简单了.

不建议强制写数.与大小端有关系.不移植随便搞

使用特权

评论回复
24
刘前辈|  楼主 | 2009-4-16 17:40 | 只看该作者

谢谢圈圈、xwj 。

获益匪浅。

使用特权

评论回复
25
渤海三叠浪| | 2009-4-16 19:09 | 只看该作者

坚决反对用联合!!!!

使用特权

评论回复
26
渤海三叠浪| | 2009-4-16 19:11 | 只看该作者

不过事情总有例外的!!!嗨

自相矛盾了!

还是反对用联合!!!

使用特权

评论回复
27
ayb_ice| | 2009-4-16 22:42 | 只看该作者

i = TH0*256,i |= TL0;

使用特权

评论回复
28
yewuyi| | 2009-4-17 08:44 | 只看该作者

呵呵,为什么要反对用联合?!

首次听说还有这说法。。。

使用特权

评论回复
29
李冬发| | 2009-4-17 10:04 | 只看该作者

联合比指针直观吧,剩下的怎么写这个联合的问题

同样有大下端的问题。

使用特权

评论回复
30
computer00| | 2009-4-17 13:22 | 只看该作者

指针比联合直观啊,

使用特权

评论回复
31
atuz| | 2009-4-17 17:39 | 只看该作者

....

圈圈能不能给我讲讲为什么下面的写法可以:

int i;
i=TL0;  //  这里应该没有疑问。
(char)i=TH0;  //关键这里得到了简化。


    11: int i; 
    12: i=TL0; 
C:0x000F    AF8A     MOV      R7,TL0(0x8A)
    13: (char)i=TH0; 
    14:  
C:0x0011    AE8C     MOV      R6,TH0(0x8C)
    15: } 

这样完全跟汇编一样简了。

(char)i=TH0;  //有什么理论可以?谢谢大家。
------------------------------------------------------------

这是强制将i做完 char型处理,取i的地址。

如果是我,只会用 :
  i=(TH0<<8)|TL0;

这样代码也长不了多少。用取地址的方法估计换个小端的编译器,程序就要重写了。

使用特权

评论回复
32
highgear| | 2009-4-17 20:59 | 只看该作者

(char)i=TH0 原理很简单

相当于:
*(char*)(&i)=TH0;
对于 8-bit cpu,这种做法依赖编译器对16-bit整数高位在前还是在后的处理。
如果高位在前,(char)i=TH0; 成立;
在后,则必须用: *((char*) &i +1)=TH0;

至于16-bit cpu, 编译器肯定会顺从硬件的处理.

使用特权

评论回复
33
冷漠| | 2009-4-18 11:13 | 只看该作者

请教highgear大师:

刘前辈:(char)i=TH0;  //有什么理论可以?谢谢大家。
*****************************************************************

前辈问的是有什么“理论”可以,不是要你随意叙述“相当于”。

highgear:
 (char)i=TH0; 
相当于:
*(char*)(&i)=TH0;

没错!叙述十分准确。可是这个“相当于”又是根据什么理论?是所有C编译器依据的规则吗?

就算是C51,根据highgear“大师”的说法:无法解释下面:

int i,j;
(char)i=(char)j;

只有把理论搞清楚,才可能使大家应用自如。而理论还包含文字的叙述。否则,岂不是说:

根据:(char)i 相当于*(char*)(&i) ,所以下面也正确?

             (char)i=(char)j;  
上式“相当于”:  *(char*)(&i)=*(char*)(&j);  //????????


回去再请教一下所长,多给咱菜鸟讲清楚一点。




使用特权

评论回复
34
yewuyi| | 2009-4-18 11:50 | 只看该作者

呵呵,斗争无处不在啊。。。

使用特权

评论回复
35
huangqi412| | 2009-4-18 11:57 | 只看该作者

看热闹小叶也无处不在

使用特权

评论回复
36
冷漠| | 2009-4-18 12:27 | 只看该作者

highgear总是喜欢创新添加编写国际教材的新内容。

 除非他自己做编译器,“世界上流行的编译器都做错了,水平太低了,下面2个式子绝对应该是等同的,”谁不同谁错!

      (char)i=(char)j; 
 *(char*)(&i)=*(char*)(&j);    


   17: main() 
    18: { 
    19:  
    20: int i,j; 
    21: (char)i=(char)j; 
C:0x000F    850B08   MOV      0x08,0x0B
    22: *(char*)(&i)=*(char*)(&j);    
    23:   
C:0x0012    850A08   MOV      0x08,0x0A
    24: } 
C:0x0015    22       RET      
C:0x0016    00       NOP   

highgear:
瞎扯淡,冷漠这叫什么编译器.....
瞎扯淡,OS实际上就是裸奔.......

讲习所的人总是知道一点,就无限发挥, “天才”一般都是这样性格。
“咱不看书,照样创新。”
这个“相当于”,又是讲习所的创新?


明天告诉highgear,编译器理论是怎么讲的。讲习所今天要赶快讨论呀,否则,连输3个1,000¥,可真是有点说不过去了。

今后还怎么在21IC混?   

使用特权

评论回复
37
冷漠| | 2009-4-20 08:52 | 只看该作者

出差3天,highgear也没拿出个“理论”解释?

这可如何做“领军型人才”?
自己不知道可以请教所长啊。

32楼不过是把圈圈、xwj的精彩结论有改头换面复述了一遍,把别人的东西写进自己的**,再进一步请教就没声了。

让所长给你讲讲一个变量有几个特征?编译器是如何表述/表示、表达这几个特征的。

如若连最基本的概念都弄不清,还讨论什么OS?

使用特权

评论回复
38
flanker| | 2009-4-20 09:13 | 只看该作者

把编译器-o3打开,能把*256变成移位操作吗?

不妨试试看

使用特权

评论回复
39
highgear| | 2009-4-20 21:25 | 只看该作者

好问题

让大家都来评判,相信大家的眼光。

(char)i = (char)j;

这里涉及一个左值右值,取值赋值问题,需要加以区分。(char)强制是一个右值强制,不可以是左值强制。

(char)j 右值强制把一个16bit整数强制成 8bit 数而取值,此时的(char) 叫做强制**转换**, 返回 j 低8位,就是说无论高8位在前,在后,总是返回 j 低8位。

(char)i 作为左值强制(非转换,不返回一个值),而且赋值,则非常含糊,理论上不成立。但编译器既然作了,这就依赖于编译器的内部处理,那么最好的猜测就是编译器使用了最直接,最简单的处理,就是存储到第一个byte:
*(char*)(&i);

所以 
(char) i = (char) j;
这种(char) i 依赖于编译器及其内部处理的方式并不是好主意,应该使用更明确的语法。

楼上的冷馍馍,借用大伙赠给你们的一句话:
先去学会做人。









愿耶稣基督的荣光继续照耀wxj1952们;愿唯一的真主安拉和他的使者默罕默德指引wxj1952们前进的脚步;愿西安交大请wxj1952们去给他们教授讲讲课,600¥一课时



使用特权

评论回复
40
zyok| | 2009-4-20 22:07 | 只看该作者

哈哈,把老x给急得....

使用特权

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

本版积分规则