当通过cin存储的数字为负数时,为什么无符号整数会产生较大的输出?

时间:2018-08-14 14:08:58

标签: c++ int unsigned

我想知道无符号整数的工作原理。

#include <iostream>
using namespace std;

int main(){
    int a = 50;             //basic integer data type
    unsigned int b;         //unsigned means the variable only holds positive values
    cout << "How many hours do you work? ";
    cin >> b;
    cout << "Your wage is " << b << " pesos.";

}

但是当我输入-5时,输出为

Your wage is 4294967291 pesos.

当我输入-1时,输出为

Your wage is 4294967295 pesos.

假定无符号整数保持正值。这是怎么发生的? 而且我只知道基本的C ++。我不明白。

1 个答案:

答案 0 :(得分:3)

从有符号到无符号整数的转换是通过以下规则(§[conv.integral])完成的:

  
      
  1. 整数类型的prvalue可以转换为另一个类型的prvalue   整数类型。
    [...]
  2.   
  3. 如果目标类型是无符号的,则结果为   值是与源整数一致的最小无符号整数   (模2 n ,其中 n 是用于表示   无符号类型)。
  4.   

在您的情况下,unsigned显然是32位类型,因此将-5模2 32 进行模降低。因此2 32 = 4,294,967,296和4,294,967,296-5 = 4,294,967,291。