2012-05-20 235 views
2

到目前爲止我有這個代碼。當我添加兩個負整數時,答案是肯定的而不是負數。我該如何解決? 我想爲0x80000000是一個整數十六進制加減

#include <iostream> 
#include <string> 

using namespace std; 

int main(void) 
{ 
unsigned int maxInt = 0x7FFFFFFF; 
int num1 = 7; 
signed int minInt = 0x80000000; 
int num2 = -21; 
float num3 = 1; 
float i; 

cout<<"The value of the first variable is: "<<maxInt<<endl; 
cout<<"The value of the second variable is: "<< num1<<endl; 
cout<<"Addition of the two numbers: "<< maxInt + num1 <<endl; 
cout<<endl; 

cout<<"The value of the first variable is: "<<minInt<<endl; 
cout<<"The value of the second variable is "<<num2<<endl; 
cout<<"Addition of the two numbers: "<< minInt + num2 <<endl; 
cout<<endl; 

system("pause"); 
return 0; 
} 
+2

什麼是輸出?你期望它是什麼? –

+0

你不修正它,給'minInt'加一個負數會產生一個超出範圍的結果,增加溢出,這是未定義的行爲。 –

+0

從'minInt'的任何減法都會導致下溢,這將表示爲正數。由於沒有足夠的位,因此無法用「int」修復此問題。你需要一個數據類型(比如'longlong'),它有更多的位。 –

回答

8

添加爲0x80000000和-21最小的可能值給出0x7FFFFFDF的結果。這個十進制數字是2​​147483615.發生這種情況是因爲最左邊的位用於確定符號。你會得到一個下溢,在這種情況下,它會繞過最大整數並從那裏開始倒計時。同樣的事情應該以另一種方式發生,加入兩個正整數,除了它將歸零爲0,因爲它是無符號的,但在上溢或下溢時它是未定義的行爲。

正如評論說,你可以使用一個更大的類型:

int64_t result = static_cast<int64_t>(maxInt) + num1; 
int64_t result2 = static_cast<int64_t>(minInt) - num2; 
+0

一個很好的解釋。你能回答這個問題的第二部分:「我該如何解決這個問題?」 –

+0

@AdamLiss,正式注意。我爲它添加了一些代碼,保證結果爲64位。 – chris

+0

-1。這個例子是錯誤的。在分配給更長的類型之前會發生溢出。哎呀。 –