论坛: 编程破解 标题: C语言移位操做的问题! 复制本贴地址    
作者: Fantasy [pda]    论坛用户   登录
我看书上说移出的位就会消失那么: 
X=7 用二进制表示为00000111 
X<<1用二进制表示为00001110 
X<<5用二进制表示为11000000 
那X<<9不就都变成0000000了吗?

地主 发表时间: 07/12 19:19

回复: xiean [xiean]   论坛用户   登录


B1层 发表时间: 07/12 21:27

回复: Fantasy [pda]   论坛用户   登录
那都变成00000000怎么可能还显示出数来呢?

就是显示出来也只能是0呀!~~~

B2层 发表时间: 07/13 14:10

回复: 286 [unique]   版主   登录
移位会消失。但具体语言实现是不一样的。
比如C语言int在PC机上用4个字节表示。所以最低位如果左移需要移32次才会溢出。
因为会溢出,所以一般在确保不会溢出时才作运算,左移类似于乘2运算,右移类似于除2运算。可以利用移位作位判断运算。
比如,读字库点阵时可用移位运算。

#include <stdio.h>
main()
{
int a=1;
for (int i=0;i<32;i++)
{
a<<=1;
printf("%d\n",a);
}
}

B3层 发表时间: 07/13 14:33

回复: Fantasy [pda]   论坛用户   登录
你的程序我不明白也不能运行!

那7<<32次才会溢出那<<9用二进制怎么表示呀?

B4层 发表时间: 07/13 15:06

回复: xiean [xiean]   论坛用户   登录
286 的意思就是当你
int x = 7;
时,在PC上内存实际是
00000000 00000000 00000000 00000111
来表示,并非 00000111,用16进制就是
00 07H

B5层 发表时间: 07/13 16:04

回复: Fantasy [pda]   论坛用户   登录
哦~~~明白~了~

谢谢回贴的人:P

不过我现在想问一个和本标题无关的问题~~~

邪安版主你写的
00000000 00000000 00000000 00000111表示为16进制就是00 07H

是不是每8位转成16进制的一个数呀?所以才写成00 07H!

[此贴被 Fantasy(pda) 在 07月13日20时15分 编辑过]

B6层 发表时间: 07/13 19:46

回复: xiean [xiean]   论坛用户   登录
上面16进制只写了两个字节,准确说是 00 00 00 07H 的,我写简单了点,每四位2进制对应一个16进制,比如

0001 0010 0011 0100 0101 0110 0111 1110 1111就是16进制的
1    2    3    4    5    6    7    E    F

而三位2进制对应8进制,如
001 010 011 100 101 110 111
1   2   3   4   5   6   7

这样说你明白没?int 四字节实际上就是8个16进制,如 040CAB9EH,在内存中存放为 9E AB 0C 04

上面写得简单,希望不会让你误解,本来我准备写成 0x07 的说。。。呵呵

B7层 发表时间: 07/13 23:03

回复: Fantasy [pda]   论坛用户   登录
哦~~明白了~~(如果你写成0x07那我就更晕了)

不过286说左移32次才会溢出,可是我左移20次就会显示出0如果左移32次显示7左移15次是-32768这是为什么呢?

是不是一个整型的数右移1次就是整除2一次呀?

B8层 发表时间: 07/14 15:57

回复: 286 [unique]   版主   登录
首先你要知道什么是移位,而且还要知道移位有很多种,具体可参见汇编语言中移位操作指令.
我说左移32位才溢出是指C语言的int类型在PC机上的表示,换成别的语言,别的类型,别的机器上就变了.比如C语言char类型8次就溢出了.
所谓移位就是所有位同时移,所以与数据没关系.什么数都可以移.
左移时,最左边的数(最高位)将出现溢出,而不是全部数据溢出.
当左移到一定程度时,最高位变为1,此时如果定义这个数为有符号数,将变成负数.
当右移到一定程度,最低位不断消失,最后肯定会只变成0.


B9层 发表时间: 07/14 17:38

回复: Fantasy [pda]   论坛用户   登录
我用的是C语言也是整型(int)当然我用的也是PC计算机!



B10层 发表时间: 07/14 19:11

回复: shesh [shesh]   版主   登录
讨论这个没什么意义,一般8位才会移,32位移的话就跟CPU有关了.

PC机中是高字节在前的,所以你移位INT型的时候就不一样了.

B11层 发表时间: 07/15 16:52

回复: pinkuang [pinkuang]   论坛用户   登录
你们真是厉害啊
我现在学C,不知道为什么,好象学不回
如果一个数学和英语一点都不好的学生
有可能学回编程么?
哥哥告诉我好么?

B12层 发表时间: 07/15 20:07

回复: Fantasy [pda]   论坛用户   登录
C语言里整型好像是占2个字节吧?

float和long才是4个字节吧!

B13层 发表时间: 07/21 13:29

回复: 286 [unique]   版主   登录
不是说了吗.
不同机器不同C编译版本不同操作系统结果不一样.
有些4字节有些2字节.

B14层 发表时间: 07/22 11:41

回复: Fantasy [pda]   论坛用户   登录
我说的就是普通的PC计算机!

难到不同的PC计算机都不同吗?

B15层 发表时间: 07/22 19:41

回复: 286 [unique]   版主   登录
KAO,我都想急了.
你就不会试一下吗?
我一再说
1.不同机器
2.不同C编译版本
3.不同操作系统
结果不一样

#include <stdio.h>
main()
{
printf("%d",sizeof(int));
}
在TC中显示结果为2,在VC中显示结果为4.


B16层 发表时间: 07/23 09:35

回复: yuntian108 [yuntian108]   论坛用户   登录
应该先分是逻辑位移还是算术位移

B17层 发表时间: 07/25 19:31

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号