Могут ли круглые скобки в C изменить тип результата операндов побитовой операции?

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

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

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

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

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

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

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

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


person talkaboutquality    schedule 13.09.2011    source источник


Ответы (2)


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

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

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

person pmg    schedule 13.09.2011
comment
Спасибо @pmg! Я оставлю слово круглые скобки в заголовке вопроса, потому что, хотя теперь я знаю, что они не имеют отношения к делу, другие также могут подумать, что они являются причиной проблемы, выполните поиск и найдите этот ответ. Теперь я понимаю, что этот хороший ответ - частный случай изучения правил продвижения целых чисел C. Много ссылок (теперь, когда я знаю, что искать). Например. tinyurl.com/62fm8yl в stackoverflow и href = lysator.liu.se/c/rat/c2.html#3-2 - обсуждение неподписанных сохранение и сохранение ценностей. - person talkaboutquality; 15.09.2011

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

person Lindydancer    schedule 13.09.2011