打印

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

[复制链接]
2757|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。
请高手来解释一下这个问题。


使用特权

评论回复
5
hotpower| | 2008-10-5 21:54 | 只看该作者

!好像更正确~~~

使用特权

评论回复
6
icmap|  楼主 | 2008-10-6 19:56 | 只看该作者

建议

建议“~”仅用于字节变量取反,位变量取反用“!”。

使用特权

评论回复
7
yewuyi| | 2008-10-6 21:54 | 只看该作者

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

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


晕。。。

使用特权

评论回复
8
oumi| | 2008-10-7 08:44 | 只看该作者

确实很废话

使用特权

评论回复
9
computer00| | 2008-10-7 10:02 | 只看该作者

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

~取反的操作通常是按照整数来操作的。所以按位取反用~,而逻辑取反则用!。即使只有一位,也应该如此。

使用特权

评论回复
10
wlq_9| | 2008-10-7 13:40 | 只看该作者

举这种例子

请用普通话,不要用方言.
什么bit................
根本就看不出来转换的必要!倒是一些复杂点地方,比方说结构指针等地方转换以后才相当爽!

使用特权

评论回复
11
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
  • 使用特权

    评论回复
    12
    myfaith| | 2008-10-7 14:04 | 只看该作者

    这个问题确实有点多余

    使用特权

    评论回复
    13
    zuoyou| | 2008-10-7 15:32 | 只看该作者

    10楼真搞笑

    位bit实际上就是个逻辑判断,故应用!,而~仅对BYTE/WORD/DWORD

    使用特权

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

    本版积分规则

    11

    主题

    180

    帖子

    0

    粉丝