dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
阅读:1071回复:16

关于 &ff 问题?

楼主#
更多 发布于:2003-10-31 10:52
知识都还给老师了,想不明白为什么&0xff会改变一个数?

printf(" %d  %d",-127,-127&0xff);
输出是  -127  129  为什么?
当个好的屠夫一直是我的梦想
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
1C#
发布于:2004-07-15 14:15
Re:关于 &ff 问题?
为啥子噢?
当个好的屠夫一直是我的梦想
mumu
写手
写手
  • 铜币0枚
  • 威望0点
  • 贡献值0点
2C#
发布于:2004-07-15 09:34
Re:关于 &ff 问题?
奶奶的,才发现wchar_t在win32平台都比unix下小一半,烂微软真讨厌!
王小波说:“中年妇女在中国是一种自然灾害,这倒不是因为她们不好看,而是因为她们故意要恶心人。” 一天,我乘坐公交车,一位MM突然转过头来对我说:“你帅吗?”我说:“我不帅!”MM突然给我一巴掌,并说:“我最讨厌说谎的人了!” 如果你更热爱金钱而非自由,更习惯于被奴役的安宁而畏惧令人充满活力的争取自由的抗争,那么,请你静静地走开。我们不会乞求你的建议或是帮助。伏下身去讨好那喂养你的人吧。但愿身上的锁链不会给你造成太多的痛苦,但愿未来的人们不会记起你曾经是我们的国人 Samuel Adams: 18世纪美国独立革命重要领袖,著有“殖民者的权利”
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
3C#
发布于:2004-07-14 16:47
Re:关于 &ff 问题?
原来参数传递全靠 push xx(DWORD), 无论哪种类型,
当个好的屠夫一直是我的梦想
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
4C#
发布于:2004-07-14 15:01
Re:关于 &ff 问题?
今天又遇上同样的问题
查了下 intel 手册, shr 只对后5位有效
i=32;
j=1>>i;
在未优化的情况下成为
mov dword ptr, 20h;
mov eax, 1
mov ecx, dword ptr;
shr eax,cl;
mov dword ptr[j],eax

下面是Intel文档中关于shl指令限制移位次数的说明:
The destination operand can be a register or a memory location. The count operand can be an immediate value or register CL. The count is masked to 5 bits, which limits the count range to 0 to 31. A special opcode encoding is provided for a count of 1.

而 1>>32 是常量运算, 编译器会先进行处理, 发现 32 大于 31 时会直接将结果设置为0

也许在不同机器上 i=32; j=1>>i; 会编译出不同结果.

函数  fun ( char c ) 参数传递是个数字比较奇怪, 是不是所有类型参数传递都这种方式?
当个好的屠夫一直是我的梦想
春丽
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
5C#
发布于:2003-11-05 18:31
Re: 关于 &ff 问题?
为什么总表达不清楚,这个问题我早想过,我觉得表达不好可能是因为脑子太快了,嘴跟不上思想造成的。我也是这个毛病。唉!
呵呵
:)
kmwang
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
6C#
发布于:2003-11-03 23:07
Re: 关于 &ff 问题?
松松,你还用听课?,有空来我这坐坐:)
to southest:
我的手机和邮箱你问电班的要一下,一般我都在学校,现给我看看你的程序.
to dabou:
表达生涩可是我的大毛病,老是讲的不清楚:( [ 2003-11-03 23:09:05 kmwang 修改 ]
southeast
著名写手
著名写手
  • 铜币0枚
  • 威望0点
  • 贡献值0点
7C#
发布于:2003-11-03 19:46
Re: 关于 &ff 问题?
能不能介绍一点头文件啊
[img]http://www.wait4c.com/bbs/userfiles/2196/2005051614543457820.jpg[/img]
松柏
论坛版主
论坛版主
  • 铜币371枚
  • 威望39点
  • 贡献值0点
  • 社区居民
8C#
发布于:2003-11-03 14:10
Re: 关于 &ff 问题?
KMWang,哪天有你的课呀,想去听哦。可是请不下来假
[color=#0000FF]馋嘴蜗牛[/color] 我的博客:[url]http://osnaile.osdn.cn/[/url]
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
9C#
发布于:2003-11-03 09:58
Re: 关于 &ff 问题?
:) 明白了
没听你的课真是可惜,
愈发不明白的是 你怎么对这么细节的问题了如指掌???


ps. 你的表述太生涩了:
"i << 32 = 1是正确的,因为对于32bit机器整数有效的移位位数是5位,因次,对于整数,32已经越界,是0."
==
指令只认后 5bit.
所以 i<<32 == i<<0
i<<33 == i << 1


当个好的屠夫一直是我的梦想
kmwang
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
10C#
发布于:2003-11-02 20:38
Re: 关于 &ff 问题?
注意,我说16位错了,是因为-127和0xff都是常数,不能按short进行理解,但是在程序里面,他的结果是整数,正如void fun(char c)中的c传递的时候不是按照一个字节进行传递一样,而是一个整数.
i = 1;
i << 32 = 1是正确的,因为对于32bit机器整数有效的移位位数是5位,因次,对于整数,32已经越界,是0.但是1 >> 32却不是这样,1是一个int吗?当然不是,他是一个常数,所以,1 >> 32 = 0;如果在gcc下会有一个警告.
这个和cpu的确有关,这也是为什么int在不同的cpu上会有不同的位数.
-127 & 0x1ffff = ?,如果按照16位,你就错了.
这东西我还没看到那本书里有介绍的,所以c语言老师没讲也是应该的.
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
11C#
发布于:2003-11-02 15:49
Re: 关于 &ff 问题?
-127 & 0x1ff =385
-127 & 0x3ff =897
16,32位都可以得到这个结果,为什么说16位错了?
int i;
i=1;
i>>32 = 1?  怎么会得1呢,实在是想不明白,这和 int 是32bit的(win32 system)有关吗!
???
当个好的屠夫一直是我的梦想
southeast
著名写手
著名写手
  • 铜币0枚
  • 威望0点
  • 贡献值0点
12C#
发布于:2003-11-02 12:51
Re: 关于 &ff 问题?
给我们上C的老师怎么没讲这些啊 -------------------- luckynatalie
-----------------
我喜欢,我很喜欢,我真的喜欢,我真的很喜欢,我确实喜欢,我确实很喜欢嘛。
[img]http://www.wait4c.com/bbs/userfiles/2196/2005051614543457820.jpg[/img]
kmwang
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
13C#
发布于:2003-10-31 18:44
Re: 关于 &ff 问题?
dabou你错了.不是16位的.
-127 & 0x1ff = ?
-127 & 0x3ff = ?
...
试验一下:)
注意-127是常数,和int short都无关.
我上课的时候举的例子是这个
int i;
1 >> 32 = ?
i = 1;
i >> 32 = ?
不果你好像没听过我的课,所以没还给我:)其他书里没有,所以你谁都还不了.
常数进行运算时首先进行有效位数计算(在这例子中是int类型),然后建立相应的运算.
如果你不信,试验一下32位整数
 1111 1111 1111 1000 0001
&0000 0000 0000 1111 1111
--------------------------
还不一样 [ 2003-10-31 18:57:47 kmwang 修改 ]
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
14C#
发布于:2003-10-31 15:57
Re: 关于 &ff 问题?
关于取内码
1.
int main(int argc, char* argv[])
{
char *pc="中国";
while(*pc!='\0')
  printf("%d ", (unsigned char)*pc++ );

return 0;
}
2.
int main(int argc, char* argv[])
{
char *pc="中国";
while(*pc!='\0')
  printf("%d ", *pc++&0xff );

return 0;
}

1.2.效果一致
当个好的屠夫一直是我的梦想
dabou
小有名气
小有名气
  • 铜币0枚
  • 威望0点
  • 贡献值0点
15C#
发布于:2003-10-31 15:41
Re: 关于 &ff 问题?
 1111 1111 1000 0001     -127
&0000 0000 1111 1111     0xff
 -------------------
 0000 0000 1000 0001     129

原来是16位,汗~
 
thx,:)
 
 
当个好的屠夫一直是我的梦想
ruiner
普通会员
普通会员
  • 铜币0枚
  • 威望0点
  • 贡献值0点
16C#
发布于:2003-10-31 15:13
Re: 关于 &ff 问题?
-127&0xff 这是一个按位与运算
129是运算结果! --------------------
[img]http://www.yizuren.com/forum/UploadFile/2003527235995599.gif[/img]
游客

返回顶部