体现强制类型转换的重要性的一个例子

[复制链接]
3826|12
 楼主| icmap 发表于 2008-10-5 18:25 | 显示全部楼层 |阅读模式
请看如下代码:

bit bitA;
unsigned char ucA;
ucA =1;
bitA = ~(ucA&1);

执行结果是 bitA 为 1。

如果加上强制类型转换,改成:

bit bitA;
unsigned char ucA;
ucA =1;
bitA = ~(bit)(ucA&1);

执行结果则是 bitA 为 0。

其实
“bitA = ~(ucA&1);”相当于“bitA = (bit)~(ucA&1);”,
不同于“bitA = ~(bit)(ucA&1);”
aq_fd 发表于 2008-10-5 18:42 | 显示全部楼层

为啥呢?请赐教

为啥呢?请赐教。。。
zyok 发表于 2008-10-5 18:49 | 显示全部楼层

o ,还好没这麽用过...

 楼主| icmap 发表于 2008-10-5 21:17 | 显示全部楼层

解释一下

可以将上面的例子改简单一点:
bit bitA;
unsigned char ucA;
ucA =1;
bitA = ~ucA;  //此处结果 bitA 为 1。
bitA = ~(bit)ucA;  //此处结果 bitA 为 0。

(说明:符号“~”在 Keil C51 中表示“位取反”。)

下面的说明假设 ucA 的值为 0x01。

先说“bitA = ~ucA;”:
此表达式等价于
bitA = ~(0x01),
即 bitA = (字节变量0x01取反),
即 bitA = 0xFE;
此时编译器进行隐式类型转换:
0xFE 不为 0,相当于逻辑变量“真”即逻辑“1”,所以 bitA 为 1。

再说“bitA = ~(bit)ucA;”
此表达式等价于 
bitA = ~(位变量1), //此处进行强制类型转换
即 bitA = (位变量1取反),
即 bitA = (位变量0)。
所以 bitA 为 0。

但是我发现一个问题,对于下面这二行代码:
bit bitA;
bitA = ~(bit)1;
理论上 bitA 的值应该是 0,可是执行结果却是 1。
似乎强制类型转换对常量无效,不知道是不是编译器的 BUG。
请高手来解释一下这个问题。


hotpower 发表于 2008-10-5 21:54 | 显示全部楼层

!好像更正确~~~

 楼主| icmap 发表于 2008-10-6 19:56 | 显示全部楼层

建议

建议“~”仅用于字节变量取反,位变量取反用“!”。
yewuyi 发表于 2008-10-6 21:54 | 显示全部楼层

呵呵,本来就是废话。。。

位取反有几个人不是用! ?


晕。。。
oumi 发表于 2008-10-7 08:44 | 显示全部楼层

确实很废话

computer00 发表于 2008-10-7 10:02 | 显示全部楼层

bit变量本来就不是标准C语言的东西。

~取反的操作通常是按照整数来操作的。所以按位取反用~,而逻辑取反则用!。即使只有一位,也应该如此。
wlq_9 发表于 2008-10-7 13:40 | 显示全部楼层

举这种例子

请用普通话,不要用方言.
什么bit................
根本就看不出来转换的必要!倒是一些复杂点地方,比方说结构指针等地方转换以后才相当爽!
wlq_9 发表于 2008-10-7 13:46 | 显示全部楼层

比方说

一个已知串口缓冲区,内部存的是已知的通讯结构,这个时候.
uint8  RcvBuf[100];
typedef struct {
   uint8  header;
   uint8  cmd;
   uint8  addr;
   ******************
}COMM_TYPE;

使用的时候
#define RCVFRAME ((COMM_TYPE *)&RcvBuf[0])
直接使用 就可以访问对应段,而不需要RcvBuf[0],RcvBuf[1]....RcvBuf
  • ....
    RCVFRAME->header
    RCVFRAME->cmd
    RCVFRAME->addr
  • myfaith 发表于 2008-10-7 14:04 | 显示全部楼层

    这个问题确实有点多余

    zuoyou 发表于 2008-10-7 15:32 | 显示全部楼层

    10楼真搞笑

    位bit实际上就是个逻辑判断,故应用!,而~仅对BYTE/WORD/DWORD
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    11

    主题

    180

    帖子

    0

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