[英]C++ did wrong mathematics?
我在 C++ 中編譯了這個基本計算,但是在計算器上做的時候得到了錯誤的答案。 即使我將“ans”聲明為“long long int”,這怎么可能?
#include <iostream>
#include <cstdlib>
#include<vector>
#include<string>
#include <unordered_map>
#include <utility>
using namespace std;
int main(){
long long int ans=1-1000000000+1-1000000000+1-1000000000;
cout<<ans; //-2999999997
return 0;
}
預期的答案是針對cout<<ans;
但編譯器返回的是: 1294967299
請讓我知道我在哪里出錯了。
一個更現代的 C++ 編譯器會告訴你問題是什么,就像我的一樣:
警告:“int”類型的表達式中的 integer 溢出導致“1294967299”
這些數字對於您的int
實現中的默認大小來說太大了。 您必須告訴您的 C++ 編譯器您的數字是long long
s:
long long int ans=1-1000000000LL+1-1000000000LL+1-1000000000LL;
long long int
所做的就是告訴您的 C++ 編譯器數學表達式的結果是long long int
。 您的問題是您必須告訴 C++ 編譯器它用於計算表達式的數字也是long long
s。
它采用ints
並將它們計算為ints
,然后將結果存儲在long long
中。 因此,在您存儲long long
之前會發生溢出
為了做到這一點,將LL
放在每個數字的末尾。
像這樣: 1LL
而不是1
。
你錯了沒有啟用編譯器警告。 假設您使用的是g++
或clang++
,請使用-Wall
,您將受到啟發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.