Установить все байты int в (без знака) 0, гарантированно равный нулю?
Это не вопрос рекомендуемая практика (ни неопределенное поведение), но о чемc ++ -стандарт фактически гарантирует при преобразовании всех байтов целочисленного типа в значение(unsigned char)0
.
В приведенном ниже фрагменте это выражение, используемое Если-заявление гарантированно будет оценено какправд в C ++ 11?
std::memset (
reinterpret_cast<char*> (&a), // int a;
(unsigned char)0,
sizeof (int)
);
if (a == 0) {
...
}
Читая цитаты из стандартов C99 и C ++ 11 (далее в этом посте), мы находим, что C99 явно Гарантии что целочисленный тип со всеми битами, установленными в0
будет представлять значение0
в этом типе.
Я не могу найти эту гарантию в стандарте C ++ 11.
Разве нет такой гарантии? Результат предыдущего фрагмента действительно зависит от реализации? В C99 (ISO / IEC 9899: 1999) 5.2.1.2 / 1 Многобайтовые символыБайт со всеми нулевыми битами должен интерпретироваться как нулевой символ независимо от состояния сдвига. Такой байт не должен встречаться как часть любого другого многобайтового символа.
6.2.6.2 / 1 Целочисленные типыЗначения любых битов заполнения не определены. 45) Допустимое (не перехватываемое) объектное представление целого типа со знаком, где бит знака равен нулю, является допустимым объектным представлением соответствующего типа без знака и должно представлять то же значение.
Для любого целочисленного типа представление объекта, в котором все биты равны нулю, должно быть представлением значения ноль в этом типе.
В C ++ 11 (ИСО / МЭК 14882: 2011) 2.3 / 3 Наборы символов [lex.charset]Базовый набор символов выполнения и базовый набор широких символов выполнения должны содержать все элементы базового набора исходных символов, а также управляющие символы, представляющие предупреждение, возврат и возврат каретки, а также нулевой символ (соответственно, нулевой широкий символ), представление которого имеет все нулевые биты.