[英]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);
您的scanf
:C ++中溢出有符號整數類型的行為是不確定的 。 推測幕后發生的事情是毫無意義的。 “正常溢出”尤其沒有意義。
您的cin
:C ++ 03之前的版本,如果x
無法容納輸入,則不會更改x
。 因此,后續cout
的行為將是不確定的,因為您將回讀未初始化的變量。 從C ++ 03開始,如果超出x
的范圍,則將x
為最大(或最小)值。 那就是第二種情況。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.