【发布时间】:2015-12-22 21:16:49
【问题描述】:
我写了一些代码来计算一个单词中的位数。当我printf() 计数时,它按预期打印 32,但是当我将相同的代码粘贴在函数中并打印返回值时,它给了我一些疯狂的大数字。
然后我将代码复制/粘贴回main() 打印计数并同时打印我的函数的返回值,嘿,他们都给了我 32 但如果我随后注释掉 main() 我的函数中的代码再次打印大数字。
有人知道为什么会这样吗?
#include <stdio.h>
int wordlength();
int main() {
printf("%d", wordlength()); // prints 4195424 but
// if I uncomment the code below
// it then prints 32 like I want
// int count;
// unsigned int n = ~0;
//
// while( n != 0) {
// n = n >> 1;
// count++;
// }
// printf("\n%d", count); // prints 32 as expected
return 0;
}
int wordlength() {
int count;
unsigned int n = ~0;
while( n != 0) {
n = n >> 1;
count++;
}
return count;
}
【问题讨论】:
-
你可以通过打印
CHAR_BIT * sizeof(int)来避免这一切 -
使用
-1而不是~0意味着您的代码甚至可以在深奥的平台上工作 -
@M.M 我不相信存在
~0不适用于无符号整数的系统? -
@M.M 如果您要担心深奥的平台:OP 的方法在具有填充位的平台上可以正常工作,而您的乘法则不能。
-
@Lundin
~0u是可移植的,但(unsigned) ~0仅在~0评估为-1时表示相同的含义,即当二进制补码用于负数时。
标签: c function printf return-value