2017-01-04 6 views
2

В следующей программе будут повторяться ~ и < < операции сходятся к отрицательному значению на всех платформах?Будут повторяться операции ~ и << сходятся к отрицательному значению на всех платформах?

#include <iostream> 

int main() 
{ 
    int x{}; 
    for(int i{}; i < 32; ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 

Моя оценка такова, что это будет потому, что сдвиг влево не является определением реализации. Можно ли сказать, что единственный раз, когда он не будет сходиться, будет ли int больше 32 бит?

+0

Что подразумевается под «int i {}»? Или 'int x {}' в этом отношении? Пустой список инициализаторов для ординала, vs '= 0', который по умолчанию используется для этого типа данных? –

+4

Левый сдвиг подписанных переменных не определен, если он переполняется. – Barmar

+4

@DavidLively 'int i {}' означает инициализацию значения. Для целочисленного POD это означает, что он будет инициализирован 0. – wally

ответ

0

Моя оценка такова, что это будет потому, что левая смена не реализация определена.

Вышеуказанное утверждение неверно. Левый сдвиг отрицательного значения равен undefined behavior, а значение отрицательно, как только биты начального нулевого значения инвертируются.


Если переменная была беззнаковое целое, то было бы справедливо сказать, что он будет стремиться к положительному значению на всех совместимых платформ (если достаточное количество битов сдвинуты):

#include <iostream> 
#include <limits> 

int main() 
{ 
    unsigned short x{}; 
    for(int i{}; i < CHAR_BIT*sizeof(unsigned short); ++i) { 
     x = ~x; 
     x <<= 1; 
     std::cout << x << '\n'; 
    } 
} 

Производит (по системе дополнений 2):

65534 
2 
65530 
10 
65514 
42 
65450 
170 
65194 
682 
64170 
2730 
60074 
10922 
43690 
43690 
+1

тест на одной/части/самой платформе не может быть доказательством для ВСЕХ платформ –

+0

, чтобы быть правдой, настоящие современные платформы обычно чаще встречаются в арифметических, чем древние. Я могу условно согласиться с практическими предположениями на 99% сегодняшних архитектур.Но они не переносимы вообще. –

+0

@JacekCz Хорошая точка. Только если платформы соответствуют стандартам C++. – wally