DarkSE 发表于 2016-2-14 14:10:41

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;
        }

}

迷雾少年 发表于 2016-2-15 14:12:23

c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2   二进制就是 2的二进制0010 (前面有28个0)   然后每个位都反过来+1 所以 -2的二进制是
‭‭11111111111111111111111111111110‬ (32位)‬
因为你这里是unsigned short   16位所以取低16位 ‭1111111111111110就是表示 65534

。。。应该是这样。。。



DarkSE 发表于 2016-2-15 14:38:51

迷雾少年 发表于 2016-2-15 14:12
c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2   二进制就 ...

谢谢啦{:9_228:}

the_wwym 发表于 2021-4-13 02:24:51

迷雾少年 发表于 2016-2-15 14:12
c语言里的unsigned 无符号类型的话只能表示正数的,,符号位直接拿来用了。。
比如你输入的-2   二进制就 ...

unsigned short不是2个字节16位的吗为什么会影响32位的数值。
页: [1]
查看完整版本: unsigned short 输入了负数怎么也搞不懂