LINUX.ORG.RU

bitwise операции над signed char

 ,


0

1
    char *ptr;
    u32 mask, shift, val;
    ...
    val = (*ptr & mask) >> shift;

Поскольку char может быть как со знаком так и без, какие сторонние «эффекты» могут быть при выполнении AND,OR или XOR когда один из операндов signed?

Я знаю что >> или << дают undefined behaviour в таких случаях, но не уверен насчет AND/OR.

★★

какие сторонние «эффекты» могут быть при выполнении AND,OR или XOR когда один из операндов signed?

Для этого нужно внимательно читать стандарт. Или просто преобразовать char * в unsigned char *.

tailgunner ★★★★★
()
Ответ на: комментарий от tailgunner

Так ведь я понимаю, что нужно преобразовать в unsigned char *, но мне нужно «научное обоснование» :) то есть цитата из стандарта. Я думал, здесь есть люди которые цитируют С стандарт на память ;-)

cruz7 ★★
() автор топика

И у меня вторая звезда

Поскольку char может быть как со знаком так и без, какие сторонние «эффекты» могут быть при выполнении AND,OR или XOR когда один из операндов signed?

В твоём случае *ptr преобразуется к u32, со знаком char или без.

utf8nowhere ★★★
()
Последнее исправление: utf8nowhere (всего исправлений: 1)
Ответ на: И у меня вторая звезда от utf8nowhere

В твоём случае *ptr преобразуется к u32, со знаком char или без.

Гм.. не совсем, в данном случае *ptr будет преобразован к int, раздел 6.3.1.1 стандарта:

«If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int; otherwise, it is converted to an unsigned int. These are called the integer promotions.»

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

Я тебе описал конечный эффект, а ты мне указываешь на промежуточный шаг.

6.5.10 (Bitwise AND operator)/3: The usual arithmetic conversions are performed on the operands.

6.3.1.8 Usual arithmetic conversions: … Otherwise, the integer promotions are performed on both operands. Then the following rules are applied to the promoted operands:
… (doesn't apply)
Otherwise, if the operand that has unsigned integer type has rank greater or equal to the rank of the type of the other operand, then the operand with signed integer type is converted to the type of the operand with unsigned integer type.
… (doesn't apply)

utf8nowhere ★★★
()
Ответ на: комментарий от cruz7

Я думал, здесь есть люди которые цитируют С стандарт на память ;-)

Весь стандарт? Не думаю. Зачем? Достаточно знать места, где лежат грабли, и обходить их. Какие именно грабли лежат в тех местах, и можно ли ловко пробежать по ним - лишнее знание.

tailgunner ★★★★★
()
Ответ на: комментарий от utf8nowhere

Но ведь есть еще «знаковый» бит. Если char со знаком, а мы ожидаем без знака, то информация в этом бите будет потеряна при AND операции, разве нет?

В этом случае unsigned char гарантированно поможет.

cruz7 ★★
() автор топика
Ответ на: комментарий от utf8nowhere

Вот этот комментарий:

В твоём случае *ptr преобразуется к u32, со знаком char или без.

Вы как бы намекали что 'unsigned char *' не нужен?

cruz7 ★★
() автор топика
Ответ на: комментарий от cruz7

В общем, я не вижу проблем в преобразовании char -> int -> u32 на two's complement машине с u32 == unsigned int (вряд ли это что-то другое), знаковый ли char или нет.

utf8nowhere ★★★
()
Ответ на: комментарий от I-Love-Microsoft

Знание, доступное лишь 5-звёздочным!

slapin ★★★★★
()
Ответ на: комментарий от utf8nowhere

не должно возникнуть проблем, но на паре древних систем я видел проблемы при преобразовании signed-unsigned, так как где-то это происходит с потерей знакового бита, а где-то нет...

slapin ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.