Может “символ со знаком” и “неподписанный символ” всегда бросок быть друг другу без потери данных?

В C++ мы можем иметь signed char и unsigned char это имеет тот же размер, но содержит различные диапазоны значений.

В следующем коде:

signed char signedChar = -10;
unsigned char unsignedChar = static_cast<unsigned char>( signedChar );
signedChar = static_cast<signed char>( unsignedChar );

будет signed char сохраните его значение независимо от того, каково его исходное значение было?

6
задан sharptooth 19 July 2010 в 07:42
поделиться

4 ответа

Нет, такой гарантии нет. Преобразование signed char в unsigned char четко определено, как и все целочисленные преобразования со знаком в без знака в C ++ (и C). Однако результат этого преобразования может легко оказаться за пределами исходного подписанного типа (в вашем примере это произойдет с -10 ).

Результат обратного преобразования - unsigned char в signed char - в этом случае определяется реализацией, как и все переполненные интегральные преобразования без знака в знак в C ++ (и Уход. Это означает, что результат не может быть предсказан только на основе языковых правил.

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

10
ответ дан 10 December 2019 в 00:31
поделиться

Думаю, смысл вашего вопроса в том, что является ключевым. Когда вы говорите "потеря", вы имеете в виду, что вы теряете байты или что-то в этом роде. Вы не теряете ничего как такового, поскольку размер обоих одинаковый, просто у них разные диапазоны.

signed char и unsigned char не гарантированно равны. Когда большинство людей думают о беззнаковом символе, они думают о диапазоне от 0 до 255.

В большинстве реализаций (я должен оговориться, потому что есть разница), signed char и unsigned char равны 1 байту или 8 битам. signed char обычно от -128 до +127, тогда как unsigned char - от 0 до +255.

Что касается преобразований, то ответ на этот вопрос остается на усмотрение различных реализаций. В целом, я бы не рекомендовал вам конвертировать между ними. На мой взгляд, логично, что оно должно давать ПОЛОЖИТЕЛЬНЫЙ эквивалент, если значение отрицательное, и оставаться таким же, если положительное. Например, в Borland C++ Builder 5, учитывая signed char test = -1 и приведя его к unsigned char, результат будет 255. Или же результат будет другим, если все значения положительные.

Но что касается сравнения, хотя значения могут выглядеть одинаковыми, они, вероятно, не будут оценены как равные. Это большая ошибка, когда программисты иногда сравнивают знаковые и беззнаковые значения и удивляются, почему все данные выглядят одинаково, но условие не будет работать правильно. Хороший компилятор должен предупредить вас об этом.

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

Наконец, согласно стандарту, должно существовать простое преобразование между signed char или unsigned char в char. Но что бы он ни выбрал, это определено реализацией

3.9.1 Фундаментальные типы [basic.fundamental]

1 Объекты, объявленные как символы char) должны быть достаточно большими, чтобы хранить любой члена базового набора символов. Если символ из этого набора хранится в объекте character объекте, то интегральное значение этого символьного объекта равно значению односимвольной литеральной формы этого символа. Это определяется реализацией, может ли объект char может ли объект char хранить отрицательные значения. Символы могут быть явно объявлены беззнаковыми или знаковыми. Обычный char, подписанный char и unsigned char - это три различных типа. Символ char, подписанный char, и беззнаковый char занимают одинаковый занимают одинаковый объем памяти и имеют одинаковые требования к выравниванию (basic.types); то есть они имеют одинаковое объектное представление. Для символьных типов все биты объектного представления участвуют в представлении значения представлении. Для беззнаковых символьных типов, все возможные биты представления значения представляют числа. Эти требования не для других типов. В любой конкретной реализации, обычный объект char может принимать либо те же значения, что и signed char или unsigned char; какое именно - это определяется реализацией.

1
ответ дан 10 December 2019 в 00:31
поделиться

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

0
ответ дан 10 December 2019 в 00:31
поделиться

Мое первое предположение - "возможно". Вы пробовали протестировать это с различными входами?

-1
ответ дан 10 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: