Я новичок, помогите мне понять INTEGER OVERFLOW и работать с INTEGER LIMITS в контексте следующего примера.
Я не могу интерпретировать вывод следующего кода.
Я рассмотрел три случая, непосредственно печать, целые числа и беззнаковое длинное целое число.
#include<iostream>
#include<limits.h>
using namespace std;
int main()
{
int tmp1=0,tmp2=0,tmp3=0,tmp4=0;
unsigned long long temp1=0,temp2=0,temp3=0,temp4=0;
cout<<"Directly printing"<<endl;
cout<<-2*INT_MIN<<endl<<2*INT_MIN<<endl<<-2*INT_MAX<<endl<<2*INT_MAX<<endl;
cout<<"Using integer"<<endl;
tmp1 = -2*INT_MIN;
tmp2 = 2*INT_MIN;
tmp3 = -2*INT_MAX;
tmp4 = 2*INT_MAX;
cout<<temp1<<endl<<tmp2<<endl<<tmp3<<endl<<tmp4<<endl;
cout<<"Using unsigned long long variables"<<endl;
temp1 = -2*INT_MIN;
temp2 = 2*INT_MIN;
temp3 = -2*INT_MAX;
temp4 = 2*INT_MAX;
cout<<temp1<<endl<<temp2<<endl<<temp3<<endl<<temp4;
}
Directly printing
0
0
2
-2
Using integer
0
0
2
-2
Using unsigned long long variables
0
0
2
18446744073709551614
tmp1 = -2*INT_MIN;
неопределенное поведение, если INT_MAX не имеет удвоенной величины INT_MIN (не будет).
tmp2 = 2*INT_MIN;
неопределенное поведение (переполнение целого числа со знаком)
tmp3 = -2*INT_MAX;
неопределенное поведение, если INT_MIN не имеет удвоенной величины INT_MAX (не будет).
tmp4 = 2*INT_MAX;
неопределенное поведение (переполнение целого числа со знаком)
temp1 = -2*INT_MIN;
неопределенное поведение (переполнение целого числа со знаком)
temp2 = 2*INT_MIN;
неопределенное поведение (переполнение целого числа со знаком)
temp3 = -2*INT_MAX;
неопределенное поведение (переполнение целого числа со знаком)
temp4 = 2*INT_MAX;
неопределенное поведение (переполнение целого числа со знаком)
Других решений пока нет …