Могут ли скобки в C изменить тип результата операндов побитовой операции? - PullRequest
5 голосов
/ 13 сентября 2011

Я передал следующий код через инструмент статического анализа:

u1 = (u1 ^ u2); // OK

u1 = (u1 ^ u2) & u3;  // NOT OK

u1 = (u1 ^ u2) & 10; // NOT OK

u1 = (u1 ^ u2) & 10U; // NOT OK

u1 = (unsigned char)(u1 ^ u2) & 10U; // OK

u1 = (unsigned char)(u1 ^ u2) & u3;  // OK

«ОК» означает, что инструмент статического анализа не жаловался. «НЕ ОК» означает, что инструмент статического анализа действительно жаловался - утверждая, что некоторый операнд побитовой операции не является целым числом без знака.

Результаты последних двух строк показывают, что скобки вызывают либо

а. фактическое преобразование типа в подписанное

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

Я спрошу разработчика инструмента статического анализа о (b).

Но прежде чем я это сделаю, я хотел бы знать, если, возможно, язык C известен как (а)?

Ответы [ 2 ]

6 голосов
/ 13 сентября 2011

Ничего в C не делается ниже int: например, при добавлении двух unsigned chars, даже до добавления, операнды преобразуются в int в соответствии с акциями по умолчанию.

unsigned char u1, u2, u3;
u1 = 0;
u2 = 42;
u3 = u1 + u2;

В последней строке сначала u1 и u2 преобразуются в int, затем применяется оператор + для получения значения int, а затем это значение преобразуется обратно в unsigned char ( конечно, компилятор может использовать ярлыки!)

3 голосов
/ 13 сентября 2011

Это потому, что в C результирующий тип операции над двумя unsigned char: s равен int.Инструмент статического анализа правильно (хотя и не очень интуитивно) сообщает, что & применяется к int.

...