|
阅读:1071回复:16
关于 &ff 问题?
知识都还给老师了,想不明白为什么&0xff会改变一个数?
printf(" %d %d",-127,-127&0xff); 输出是 -127 129 为什么? |
|
|
|
1C#
发布于:2003-10-31 15:13
Re: 关于 &ff 问题?
-127&0xff 这是一个按位与运算
129是运算结果! -------------------- |
|
|
|
2C#
发布于:2003-10-31 15:41
Re: 关于 &ff 问题?
1111 1111 1000 0001 -127
&0000 0000 1111 1111 0xff ------------------- 0000 0000 1000 0001 129 原来是16位,汗~ thx,:) |
|
|
|
3C#
发布于: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.效果一致 |
|
|
|
4C#
发布于: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 修改 ] |
|
|
5C#
发布于:2003-11-02 12:51
Re: 关于 &ff 问题?
给我们上C的老师怎么没讲这些啊
--------------------
luckynatalie
----------------- 我喜欢,我很喜欢,我真的喜欢,我真的很喜欢,我确实喜欢,我确实很喜欢嘛。 |
|
|
|
6C#
发布于: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)有关吗! ??? |
|
|
|
7C#
发布于: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语言老师没讲也是应该的. |
|
|
8C#
发布于:2003-11-03 09:58
Re: 关于 &ff 问题?
:) 明白了
没听你的课真是可惜, 愈发不明白的是 你怎么对这么细节的问题了如指掌??? ps. 你的表述太生涩了: "i << 32 = 1是正确的,因为对于32bit机器整数有效的移位位数是5位,因次,对于整数,32已经越界,是0." == 指令只认后 5bit. 所以 i<<32 == i<<0 i<<33 == i << 1 |
|
|
|
9C#
发布于:2003-11-03 14:10
Re: 关于 &ff 问题?
KMWang,哪天有你的课呀,想去听哦。可是请不下来假 |
|
|
|
10C#
发布于:2003-11-03 19:46
Re: 关于 &ff 问题?
能不能介绍一点头文件啊 |
|
|
|
11C#
发布于:2003-11-03 23:07
Re: 关于 &ff 问题?
松松,你还用听课?,有空来我这坐坐:)
to southest: 我的手机和邮箱你问电班的要一下,一般我都在学校,现给我看看你的程序. to dabou: 表达生涩可是我的大毛病,老是讲的不清楚:( [ 2003-11-03 23:09:05 kmwang 修改 ] |
|
|
12C#
发布于:2003-11-05 18:31
Re: 关于 &ff 问题?
为什么总表达不清楚,这个问题我早想过,我觉得表达不好可能是因为脑子太快了,嘴跟不上思想造成的。我也是这个毛病。唉!
呵呵 |
|
|
|
13C#
发布于: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 ) 参数传递是个数字比较奇怪, 是不是所有类型参数传递都这种方式? |
|
|
|
14C#
发布于:2004-07-14 16:47
Re:关于 &ff 问题?
原来参数传递全靠 push xx(DWORD), 无论哪种类型, |
|
|
|
15C#
发布于:2004-07-15 09:34
Re:关于 &ff 问题?
奶奶的,才发现wchar_t在win32平台都比unix下小一半,烂微软真讨厌! |
|
|