C ++ и неподписанные типы - PullRequest
0 голосов
/ 01 июля 2018

Я читаю C ++ Primer 5th Edition и не понимаю следующую часть:

В типе без знака все биты представляют значение. Например, 8-битный беззнаковый символ может содержать значения от 0 до 255. включительно.

Что значит "все биты представляют значение"?

Ответы [ 5 ]

0 голосов
/ 02 июля 2018

Значение объекта тривиально копируемого типа определяется некоторыми битами в нем, в то время как другие биты не влияют на его значение. В стандарте C ++ биты, которые не влияют на значение, называются битами заполнения .

Например, рассмотрим тип с 8 битами, где последние 4 бита являются битами заполнения, тогда объекты, представленные 00000000 и 00001111, имеют одинаковое значение и сравниваются равными.

В действительности биты заполнения часто используются для выравнивания и / или обнаружения ошибок .

Зная вышеизложенное, вы можете понять, о чем говорится в книге. Это говорит, что нет никаких битов заполнения для беззнакового типа. Однако утверждение неверно . Фактически, стандарт только гарантирует, что unsigned charsigned char, char) не имеет битов заполнения. Ниже приводится цитата из связанной части стандарта [basic.fundamental] / 1 :

Для узких типов символов все биты представления объекта участвуют в представлении значения.

Кроме того, стандарт C11 6.2.6.2/1 гласит:

Для целых типов без знака, отличных от знака без знака, биты представления объекта должны быть разделены на две группы: биты значения и биты заполнения (не должно быть ни одного из последних).

0 голосов
/ 02 июля 2018

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

Назад к unsigned - текст в основном говорит о том, что значение числа без знака просто 1 << 0 + 1 << 1 + 1 << 2 + ... до общего количества битов. Важно, что не только все биты вносят свой вклад, но и все комбинации битов образуют действительное число. Это НЕ относится к <code>signed целым числам. Поэтому, если вам нужна битовая маска, это должен быть тип unsigned достаточной ширины, иначе вы можете столкнуться с недопустимыми битовыми шаблонами.

0 голосов
/ 01 июля 2018

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

0 голосов
/ 01 июля 2018

Например, один байт содержит 8 битов, а все 8 битов используются для подсчета от 0.

Для без знака все биты ноль = 00000000 означают 0, 00000001 = 1, 00000010 = 2, 00000011 = 3, ... до 11111111 = 255.
Для подписанного байта (или знакового символа) крайний левый бит означает знак и поэтому не может использоваться для подсчета. (Я оптически отделяю крайний левый бит!) 0 0000001 = 1, но 1 0000001 = -1, 0 0000010 = 2 и 1 0000010 = -2 и т. Д. До 0 1111111 = 127 и 1 1111111 = -127. В этом примере 1 0000000 будет означать -0, что бесполезно / потрачено впустую, поэтому это может означать, например, 128.

Существуют и другие способы кодирования битов в числа, и некоторые компьютеры запускаются слева, а не справа. Эти детали относятся к конкретному оборудованию и не имеют отношения к пониманию «unsigned», об этом нужно заботиться только в том случае, если вы хотите связать код одиночными битами (не рекомендуется).

0 голосов
/ 01 июля 2018

Это означает, что все 8 битов представляют фактическое значение, тогда как в со знаком символ только 7 битов представляют фактическое значение, а 8-й бит (самый значимый) представляет знак этого значения - положительный или отрицательный ( +/-).

...