一个C的小测验

[复制链接]
5005|21
 楼主| su_mj000 发表于 2007-10-6 09:46 | 显示全部楼层 |阅读模式
对一个整形变量int n;下面两种操作的结果相同吗?

n >>= 1;
n  /= 2;

zgl7903 发表于 2007-10-6 10:19 | 显示全部楼层

最好自己试一下,

对正数肯定是一样的,
但是对负数的处理不同的编译器可能产生不同的结果,对判断正负号位的编译器结果是一样的,不判断符号位的则不一样
computer00 发表于 2007-10-6 10:31 | 显示全部楼层

在C里面只有逻辑右移,没有算术右移。

所以对于负数,两者结果是不一样的。移位后负数变成了正数,/2后还是负数。
zgl7903 发表于 2007-10-6 15:05 | 显示全部楼层

可不是绝对的哦

看看在VC下的测试
#include "stdafx.h"

int main(int argc, char* argv[])
{
  int a = -1000;
  printf ("%d, %#x, %#x ",a,a>>1,a/2);
  printf ("%d, %#x, %#x ",a,a>>2,a/4);

  unsigned int b = -1000;
  printf ("%d, %#x, %#x ",b,b>>1,b/2);
  printf ("%d, %#x, %#x ",b,b>>2,b/4);
  return 0;
}
看看运行结果
//带符号的
-1000, 0xfffffe0c, 0xfffffe0c //>>1 /2
-1000, 0xffffff06, 0xffffff06 //>>2 /4
//无符号的
-1000, 0x7ffffe0c, 0x7ffffe0c //>>1 /2
-1000, 0x3fffff06, 0x3fffff06 //>>1 /2
//也就是VC下面是会进行符号扩展 
computer00 发表于 2007-10-6 15:59 | 显示全部楼层

哦?原来也有算术移位的,看来不同的编译器处理方法不一

zgl7903 发表于 2007-10-6 21:06 | 显示全部楼层

圈圈还真是谦虚阿,向你学习

computer00 发表于 2007-10-6 21:12 | 显示全部楼层

呵呵,我以前在C中只见过逻辑右移的,以后留意一下。

ayb_ice 发表于 2007-10-8 08:15 | 显示全部楼层

实际中有符号数一般不用》》,《《方式处理。。。

dld2 发表于 2007-10-8 08:21 | 显示全部楼层

同意楼上

有歧义的写法应该避免
gyt 发表于 2007-10-8 08:48 | 显示全部楼层

我也赞成8楼

赤铸 发表于 2007-10-9 21:42 | 显示全部楼层

不取决于“正负”,取决于数据类型

ANSI C 有符号数右移扩展符号位,这是肯定的
athlon64fx 发表于 2007-10-9 22:23 | 显示全部楼层

gcc-4.1.2 的测试结果与 4 楼相同.

-1000, 0xfffffe0c, 0xfffffe0c
-1000, 0xffffff06, 0xffffff06
-1000, 0x7ffffe0c, 0x7ffffe0c
-1000, 0x3fffff06, 0x3fffff06
wtfshxkj 发表于 2007-10-10 07:30 | 显示全部楼层

编译器

对于有些编译器而言:

   负数在N次右移后的最终结果为:-1;
   注:2^N >= |负数|时成立;
xwj 发表于 2007-10-10 07:37 | 显示全部楼层

呵呵,这样的题目没一点意义

不同芯片、不同编译器结果必然不一样,
任何回答都是片面的--也就是可以判成错的:-)

圈圈,
还是Blickfin用着爽,逻辑移位和算术移位各自有自己的专用指令,你不会项目做完了还连这个都不知道吧???

computer00 发表于 2007-10-10 09:23 | 显示全部楼层

不知道,哈哈~~~我一直都是认为C语言里面只有逻辑移位的...

taoyubai 发表于 2007-10-10 14:49 | 显示全部楼层

路过,学习了,

fengyeu 发表于 2007-10-10 21:20 | 显示全部楼层

风也 过学习了!

风也 过学习了!
jueju300 发表于 2007-10-12 21:53 | 显示全部楼层

..

我还以为 大家要讨论 MCU的编译成汇编以后 的类似于C 以及其他的特殊寄存器等等的结果一样不一样的问题
IceAge 发表于 2007-10-12 23:20 | 显示全部楼层

ansi c 这一点上很含糊

估计跟有些cpu 没有算术移位有关。

VC++ 中的说法:unsigned 是逻辑, signed 是算术

The right shift operator causes the bit pattern in the first operand to be shifted right the number of bits specified by the second operand. Bits vacated by the shift operation are zero-filled for unsigned quantities. For signed quantities, the sign bit is propagated into the vacated bit positions. The shift is a logical shift if the left operand is an unsigned quantity; otherwise, it is an arithmetic shift.


这一点上,还是 java 最明确:
>> 是算术, >>> 是逻辑



eleclike 发表于 2007-10-13 00:27 | 显示全部楼层

要看编译器

是哪一种移动是要看编译器的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

286

帖子

1

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