【发布时间】:2013-09-05 15:56:06
【问题描述】:
代码如下:
int create_mask(unsigned b, unsigned e)
{
unsigned int mask=1;
if(b<e || b<0 || e<0)
{
printf("Wrong values, starting bit can't be smaller than ending.\n");
printf("Both got to be >= 0.\n");
exit(EXIT_FAILURE);
}
while(b>0)
{
printf("%u\n", b);
mask<<=1;
if(b>e)
mask|=1;
b--;
}
return ~mask; /* negates mask for later purpose that is clearing corresponding bits */
}
函数为某些位操作创建掩码,但应采用两个无符号整数 b 和 e,均为非负数。问题是如何防止用户输入负数? 当使用 (-1,0) 调用函数时,它会启动循环,并应退出并出现错误。
【问题讨论】:
-
但是无符号数永远不会是负数,这是什么意思呢?
-
首先,不要让函数被
(-1, 0)调用。输入一个字符串,然后使用strtoul()将其转换为无符号整数。如果数字为负数会报错。 -
@harold 发生从有符号到无符号的隐式转换,它以
1 << width为模进行解释,其中width是unsigned int中的位数。 -
有符号整数 -1,当解释为无符号整数时,将等于最大值。所以它不小于e,或者小于0。
-
@Taemyr 不一定,仅当机器使用 2 的补码表示负数时。
标签: c negative-number unsigned-integer