簡體   English   中英

cin溢出時來自cin的異常行為

[英]Unexpected behavior from cin when overflowing int

所有,這里有一些我無法解釋其行為的代碼。 它發布在下面。 我查看了為什么整數溢出會導致C ++ iostream錯誤? ,但並不能真正回答我的問題。

#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
    int x;
    scanf("%d", &x);
    cout << "Value of x = " << x << endl;
    cin >> x;
    cout << "Failure Detected = " << cin.fail() << endl;
    cout << "Value of x = " << x << endl;
    return 0;
}

因此,我期望此代碼執行的操作是讀入一個整數,打印出該整數的值,讀入另一個整數(讀入同一變量),然后打印出該整數。 如果輸入7和2的輸入,那么它將按預期工作。 但是,如果我為第一個和第二個輸入都輸入2 ^ 31(溢出int乘以1),則第一個輸出將顯示“ x的值= -2147483648”,第二個輸出將顯示“ x的值= 2147483647”。 cin.fail()也將返回true。 cin對輸入做了什么? 我以為如果cin.fail()為true,則x的值應保持不變。 如果不受影響,我希望x的值像正常情況一樣溢出(就像scanf一樣)。 cin這是怎么回事? 為什么將值限制為整數最大值?

提前致謝!

在C ++ 98中,輸入失敗時變量未更改。 如果您嘗試輸入一個未初始化的變量,這是一個缺點。

例如:

int a;
cin >> a;
cout << a;    // UB if input failed!

在以后的標准中,當輸入超出該范圍時,變量將設置為可能的最大值或最小值。


對於operator>>(int& val) ,標准說[istream.formatted.arithmetic]:

轉換似乎由以下代碼片段執行(使用與前面的代碼片段相同的表示法):

typedef num_get<charT,istreambuf_iterator<charT,traits> > numget;
iostate err = ios_base::goodbit;
long lval;
use_facet<numget>(loc).get(*this, 0, *this, err, lval);
if (lval < numeric_limits<int>::min()) {
  err |= ios_base::failbit;
  val = numeric_limits<int>::min();
} else if (numeric_limits<int>::max() < lval) {
  err |= ios_base::failbit;
  val = numeric_limits<int>::max();
} else
  val = static_cast<int>(lval);
setstate(err);
  1. 您的scanf :C ++中溢出有符號整數類型的行為是不確定的 推測幕后發生的事情是毫無意義的。 “正常溢出”尤其沒有意義。

  2. 您的cin :C ++ 03之前的版本,如果x無法容納輸入,則不會更改x 因此,后續cout的行為將是不確定的,因為您將回讀未初始化的變量。 從C ++ 03開始,如果超出x的范圍,則將x為最大(或最小)值。 那就是第二種情況。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM