2012-06-25 6 views
2

Я работаю с GCC v4.4.5, и я не знаю схему целых чисел по умолчанию, которую я не ожидал.GCC, странная схема продвижения по целому ряду

Чтобы активировать достаточно предупреждений для предотвращения неявных ошибок, я активировал опцию -Wconversion, и с тех пор я заметил, что при выполнении кода ниже предупреждение «преобразование в« короткий int »из« int »может изменить его значение " есть.

signed short sA, sB=1, sC=2; 
sA = sB + sC; 

Это означает, что "вВ + СБН" повышен до Int, а затем присваивается , который подписал короткий. Чтобы исправить это предупреждение, я должен сделать это так.

signed short sA, sB=1, sC=2; 
sA = (signed short)(sB + sC); 

Данное предупреждение также представлено в приведенном ниже коде.

signed short sA=2; 
sA += 5; 

И может быть решена удалением оператора + = этим ...

sA = (signed short)(sA + 1); 

который немного раздражает, потому что я не могу использовать операторы + =, - =.

Я ожидал, что GCC будет выбирать правильное целочисленное продвижение по операндам. Я имею в виду, SÁ = вВ + СБН и SÁ + = 5 не должно быть повышен до Int так как все они подписали короткие.

Я понимаю, что продвижение к Int по умолчанию предотвращает переполнение ошибок, но это немного раздражает, потому что я должен бросить большую часть моего кода или изменить переменные Int.

Есть ли опция GCC, которую я мог бы использовать для представления этой цельной схемы продвижения?

Благодарим за помощь.

+0

У меня нет решения, но вы всегда можете написать 'short' вместо' signed short' в полном объеме, что может сделать это немного менее раздражающим. Я признаю, что это все еще раздражает. –

ответ

2

Это не gcc, это стандартная семантика C.

Пер 6.3.1.1:2, объекта или выражение с типом целым числом, целое число преобразования ранг меньше, чем или равен рангом Int и без знака INT преобразуется в int или unsigned int в зависимости от знаковости типа, до участия в арифметических выражениях.

Причина того, что C ведет себя таким образом, позволяет платформам, где операции ALU по типам ниже int менее эффективны, чем типы на всех типах int. Вы должны выполнить всю свою арифметику по значениям int и преобразовать обратно в short только для хранения.

+0

Несколько лет назад я работал с Borland C++ и VIsual C++, и я смог использовать оператор + = без предупреждения. Я знаю, что GCC строго поддерживает правила C, но я никогда не видел этого раньше. Это раздражает. Спасибо за ваш ответ. –