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

[复制链接]
7902|45
computer00 发表于 2009-4-16 11:33 | 显示全部楼层

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

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

*((char *)&i)=xx

了,结果就是((char *)&i)[0]=xx
xwj 发表于 2009-4-16 12:23 | 显示全部楼层

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

icecut 发表于 2009-4-16 17:40 | 显示全部楼层

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

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

不建议强制写数.与大小端有关系.不移植随便搞
 楼主| 刘前辈 发表于 2009-4-16 17:40 | 显示全部楼层

谢谢圈圈、xwj 。

获益匪浅。
渤海三叠浪 发表于 2009-4-16 19:09 | 显示全部楼层

坚决反对用联合!!!!

渤海三叠浪 发表于 2009-4-16 19:11 | 显示全部楼层

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

自相矛盾了!

还是反对用联合!!!
ayb_ice 发表于 2009-4-16 22:42 | 显示全部楼层

i = TH0*256,i |= TL0;

yewuyi 发表于 2009-4-17 08:44 | 显示全部楼层

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

首次听说还有这说法。。。
李冬发 发表于 2009-4-17 10:04 | 显示全部楼层

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

同样有大下端的问题。
computer00 发表于 2009-4-17 13:22 | 显示全部楼层

指针比联合直观啊,

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;

这样代码也长不了多少。用取地址的方法估计换个小端的编译器,程序就要重写了。
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, 编译器肯定会顺从硬件的处理.

冷漠 发表于 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);  //????????


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




yewuyi 发表于 2009-4-18 11:50 | 显示全部楼层

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

huangqi412 发表于 2009-4-18 11:57 | 显示全部楼层

看热闹小叶也无处不在

冷漠 发表于 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混?   
冷漠 发表于 2009-4-20 08:52 | 显示全部楼层

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

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

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

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

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

flanker 发表于 2009-4-20 09:13 | 显示全部楼层

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

不妨试试看
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¥一课时



zyok 发表于 2009-4-20 22:07 | 显示全部楼层

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

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

本版积分规则

快速回复 在线客服 返回列表 返回顶部