неділю, 28 квітня 2013 р.

C/C++, стандарти, компілятори, оптимізація...

Довелося недавно розповідати про представлення цілих знакових, зокрема -- від'ємних, чисел у C/C++ (signed int і сімейство). Так як часу було мало, і всі відомі мені архітектури (x86, AVR, ARM) використовують доповняльний код, (two's complement),  розповідав лише про нього. Зокрема, продемонстрував, що буде, якщо до максимального додатного значення, яке влазить у певний тип, додати 1, або від максимального за модулем від'ємного, відняти 1. (Див. додаток 1, або рисунок праворуч.)

#include <iostream>
#include <climits>

using namespace std;

int main()
{
 int m=-INT_MAX;
 cout << m << endl;
 --m;
 cout << m << endl;
 --m;
 cout << m << endl; 
 ++m;
 cout << m << endl;  
 }

Подивився на то мій колега, Орест Гера, і зауважив, що, здається, в стандарті такого не пише. Навів приклад, де компілятор відхиляється від цього правила.