2014-10-08 2 views
1

N3797::3.9.1/1 [basic.fundamental] говоритUnsigned узкого типа символа номер представления

Для неподписанных узких типажей, все возможные комбинаций бит представления на значения представление чисел.

Это немного неясно для меня. Мы имеем следующие диапазоны для узких типов символов:

unsigned char := 0 -- 255 
signed char : = -128 -- 127 

Для обоего unsgined char и signed char объектов мы имеем one-to-one отображения из множества бит в этих представлениях объектов к интегральному значению они могут представлять. Стандарт говорит, что N3797::3.9.1/1 [basic.fundamental]

Эти требования не относятся к другим типам.

Почему требование, которое я привел, не имеет значения для signed char?

ответ

3

Подписанные типы могут использовать одно из трех представлений: дополнение двух, дополнение или знаковое значение. Последние два имеют один битовый шаблон (отрицание нуля), который не представляет собой число.

В дополнение к этому в настоящее время дополняется два дополнения: more or less. но язык по-прежнему позволяет другим.

+0

+1 * так * гораздо легче читать, чем я пытался (ужасно) сказать. – WhozCraig

+0

Вы имеете в виду, что бит, представляющий знак, не участвует в представлении чисел? –

+0

@DmitryFucintv: бит знака участвует. Я имею в виду, что есть одна битовая диаграмма, полученная путем отрицания нуля (установка всех битов в одном дополнении или установка только знакового бита в знаковой величине), которая не представляет число. –

1

Несколько машин имеют так называемые «ловушечные представления». Это означает (например), что int может содержать дополнительный бит (или более одного), чтобы указать, была ли она инициализирована или нет.

Если вы попытаетесь прочитать int с этим битом, говоря, что он не был инициализирован, он может вызвать какую-то ловушку/исключение/ошибку, которая (например) немедленно отключает вашу программу с каким-то сообщением об ошибке. Каждый раз, когда вы напишите значение int, это представление ловушки очищается, поэтому чтение из него может/будет работать.

В основном, когда начинается ваша программа, она инициализирует всеint s для таких ловушек. Если вы попытаетесь прочитать из неинициализированной переменной, аппаратное обеспечение сразу поймает ее и выдаст сообщение об ошибке.

Стандартные мандаты, что для unsigned char, не допускается такое ловушечное представление - все биты unsigned char должны быть «видимыми» - они должны составлять часть значения. Это означает, что ни один из них не может быть скрыт; no образец бит, который вы положили в unsigned char, может сформировать представление ловушки (или что-то подобное). Любые биты, которые вы помещаете в unsigned char, должны просто составить какое-то значение.

Любой другой тип, однако, может имеет ловушки. Если, например, вы берете несколько (более или менее) произвольно выбранных 8 бит из другого типа и читаете их как unsigned char, они всегда будут формировать значение, которое вы можете прочитать, записать в файл и т. Д. Если, однако, вы пытаетесь их прочесть как any другой тип (signed char, unsigned int и т. д.) для него возможно сформировать ловушечное представление и попытаться сделать что-нибудь с ним может дать неопределенное поведение.