2012-05-20 7 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. Это число в десятичном формате равно 2147483615. Это происходит потому, что самый левый бит используется для определения знака. Вы получаете underflow, который в этом случае обертывается до максимального целого числа и отсчитывает оттуда. То же самое должно происходить и с добавлением двух положительных целых чисел, за исключением того, что оно будет обертываться до 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. Пример неправильный. Переполнение произойдет до назначения более длинному типу. К сожалению. –

Смежные вопросы