论坛风格切换切换到宽版
  • 4735阅读
  • 9回复

请问:temp[0]=((temp[0]<<1)>>1);这样不对吗? [复制链接]

上一主题 下一主题
离线bd7bq
 
发帖
1491
只看楼主 倒序阅读 0楼 发表于: 2011-11-11
temp[0]=((temp[0]<<1)>>1); 这样写结果不对.写成:
temp[0]=temp[0]%0x80;没有问题.
写成:
temp[0]<<=1;
temp[0]>>=1;
也没有问题.
离线BG4UVR
发帖
11211
只看该作者 1楼 发表于: 2011-11-11
这样试试呢:

temp[0]=((temp[0]<<9)>>9);
离线BG4RFF
发帖
1581
只看该作者 2楼 发表于: 2011-11-11
编译器自作聪明,把你那句直接变成temp[0]=temp[0]实际上第二句我没看懂
temp[0]&=0x7f,这样不知行不行,按位与,好像这个算法是比较常见些的,我经常用来屏蔽一些不需要的输出或输入用这个
离线BI7LNQ
发帖
599
只看该作者 3楼 发表于: 2011-11-11
分开写合起来写都一样。编译器还是拆成一样代码。

而且一般都用 &=0x7f 来取。
离线BG4UVR
发帖
11211
只看该作者 4楼 发表于: 2011-11-12
我理解楼主的问题,不是问怎样才能达到相应目的,而是问为什么语法正确第一句会不能正常工作。

这句如果想要正常工作,需要有个前提,就是参与运算的寄存器需要是8位的。
然尔目前我们常用的8位mcu参与运算的寄存器(有的mcu可能这个寄存器就是累加器),大多是16位的,这就是第一个c语句不能按设想工作的原因的一方面。
另一方面,这种问题也和编译器的设计有关系。
离线BI7LNQ
发帖
599
只看该作者 5楼 发表于: 2011-11-12
'
我理解楼主的问题,不是问怎样才能达到相应目的,而是问为什么语法正确第一句会不能正常工作。
这句如果想要正常工作,需要有个前提,就是参与运算的寄存器需要是8位的。
然尔目前我们常用的8位mcu参与运算的寄存器(有的mcu可能这个寄存器就是累加器),大多是16位的,这就是第一个c语句不能按设想工作的原因的一方面。
另一方面,这种问题也和编译器的设计有关系。
'


只要temp是unsigned char []就行了。和mcu寄存器宽度无关。
离线bd7bq
发帖
1491
只看该作者 6楼 发表于: 2011-11-12
谢谢楼上的各位,我的temp[0]是以unsigned char 定义的,想知道是不是那样写需要在编译时添加什么指令或者设置什么选项.
感谢关注.
离线BG4UVR
发帖
11211
只看该作者 7楼 发表于: 2011-11-12
只要temp是unsigned char []就行了。和mcu寄存器宽度无关。


不认同

谢谢楼上的各位,我的temp[0]是以unsigned char 定义的,想知道是不是那样写需要在编译时添加什么指令或者设置什么选项.
感谢关注.


试试这样可不可以:
temp[0] = ((unsigned char)temp[0]<<1)>>1;
离线BI7LNQ
发帖
599
只看该作者 8楼 发表于: 2011-11-12
一个unsigned char变量左移1位,编译器必须保证最高位被舍弃,不管是32bit还是16bit的cpu。
这是语义上要求的。跟cpu无关
离线BI7LNQ
发帖
599
只看该作者 9楼 发表于: 2011-11-12
'
谢谢楼上的各位,我的temp[0]是以unsigned char 定义的,想知道是不是那样写需要在编译时添加什么指令或者设置什么选项.
感谢关注.
'

1)试一下声明的时候volatile unsigned char temp[xxx];。不过我还是不建议那样连起来写。会导致编译器优化代码时候与程序员预期不同。

2)或者就拆开写,因为这样人看起来也舒服,编译器生成代码也一样。编译器并不会因为代码写成一行就少生成些代码的。

3)要么就用逻辑运算实现temp[0] &= 0x7f;