unsigned short 输入了负数怎么也搞不懂
这是小甲鱼C++32讲的代码,手贱的我输入了-2,然后就傻眼了#include <iostream>
#include <climits>
unsigned long returnfactorial(unsigned short num)throw(const char*);
int main()
{
unsigned short num = 0;
std::cout << "请输入一个整数:";
std::cin>>num;
std::cout << num <<std::endl;
while(!(std::cin >> num) || (num<1))
{
std::cin.clear();
std::cin.ignore(100,'\n');
std::cout<<"请输入一个整数:";
}
std::cin.ignore(100,'\n');
try
{
unsigned long factorial = returnfactorial(num);
std::cout << num << "的阶乘是:" << factorial<<std::endl;
}
catch(const char *e)
{
std::cout << e;
}
return 0;
}
unsigned long returnfactorial(unsigned short num)throw(const char *)
{
unsigned long sum = 1;
unsigned long max = ULONG_MAX;
for(int i=1; i<=num;i++)
{
sum *= i;
max /= i;
}
if(max < i)
{
throw"基数太大,无法求出阶乘\n";
}
else
{
return sum;
}
} c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2 二进制就是 2的二进制0010 (前面有28个0) 然后每个位都反过来+1 所以 -2的二进制是
11111111111111111111111111111110 (32位)
因为你这里是unsigned short 16位所以取低16位 1111111111111110就是表示 65534
。。。应该是这样。。。
迷雾少年 发表于 2016-2-15 14:12
c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2 二进制就 ...
谢谢啦{:9_228:} 迷雾少年 发表于 2016-2-15 14:12
c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2 二进制就 ...
unsigned short不是2个字节16位的吗为什么会影响32位的数值。
页:
[1]