打印

一个C的小测验

[复制链接]
3100|21
手机看帖
扫描二维码
随时随地手机跟帖
沙发
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下面是会进行符号扩展 

使用特权

评论回复
5
computer00| | 2007-10-6 15:59 | 只看该作者

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

使用特权

评论回复
6
zgl7903| | 2007-10-6 21:06 | 只看该作者

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

使用特权

评论回复
7
computer00| | 2007-10-6 21:12 | 只看该作者

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

使用特权

评论回复
8
ayb_ice| | 2007-10-8 08:15 | 只看该作者

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

使用特权

评论回复
9
dld2| | 2007-10-8 08:21 | 只看该作者

同意楼上

有歧义的写法应该避免

使用特权

评论回复
10
gyt| | 2007-10-8 08:48 | 只看该作者

我也赞成8楼

使用特权

评论回复
11
赤铸| | 2007-10-9 21:42 | 只看该作者

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

ANSI C 有符号数右移扩展符号位,这是肯定的

使用特权

评论回复
12
athlon64fx| | 2007-10-9 22:23 | 只看该作者

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

-1000, 0xfffffe0c, 0xfffffe0c
-1000, 0xffffff06, 0xffffff06
-1000, 0x7ffffe0c, 0x7ffffe0c
-1000, 0x3fffff06, 0x3fffff06

使用特权

评论回复
13
wtfshxkj| | 2007-10-10 07:30 | 只看该作者

编译器

对于有些编译器而言:

   负数在N次右移后的最终结果为:-1;
   注:2^N >= |负数|时成立;

使用特权

评论回复
14
xwj| | 2007-10-10 07:37 | 只看该作者

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

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

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

使用特权

评论回复
15
computer00| | 2007-10-10 09:23 | 只看该作者

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

使用特权

评论回复
16
taoyubai| | 2007-10-10 14:49 | 只看该作者

路过,学习了,

使用特权

评论回复
17
fengyeu| | 2007-10-10 21:20 | 只看该作者

风也 过学习了!

风也 过学习了!

使用特权

评论回复
18
jueju300| | 2007-10-12 21:53 | 只看该作者

..

我还以为 大家要讨论 MCU的编译成汇编以后 的类似于C 以及其他的特殊寄存器等等的结果一样不一样的问题

使用特权

评论回复
19
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 最明确:
>> 是算术, >>> 是逻辑



使用特权

评论回复
20
eleclike| | 2007-10-13 00:27 | 只看该作者

要看编译器

是哪一种移动是要看编译器的

使用特权

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

本版积分规则

39

主题

286

帖子

1

粉丝