Установить для всех байтов int значение (unsigned char)0, гарантированно представляющее ноль?

Это дело не в рекомендуемой практике(ни неопределенном поведении), а в том, что на самом деле гарантирует c++-стандарт в отношении обращения всех байтов целочисленного типа к значению (unsigned char)0.


Вопрос(ы)

В приведенном ниже фрагменте выражение, используемое оператором if-statement, гарантированно оценивается как trueв ?

std::memset (
  reinterpret_cast (&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 (ISO/IEC 14882:2011)

2.3/3     Наборы символов     [lex.charset]

Основной набор символов выполнения и базовый набор символов выполнения набор широких символов должен содержать все элементы основного исходный набор символов, а также управляющие символы, представляющие предупреждение, backspace и возврат каретки плюс нулевой символ(соответственно, нулевой широкий символ), представление которого имеет все нулевые биты.

43
задан 0x499602D2 21 June 2013 в 19:57
поделиться