Intereting Posts
Как вы напечатаете любой символ, строку или значение переменной без библиотечных функций в C? Почему open делает мой файловый дескриптор 0? В чем заключается необходимость использования состояний IN и OUT в следующем сценарии? Распределение динамической памяти ANSI C и когда мы должны освобождать память Почему 7% -5 дает 2, но -7% 5 дает -2? Разве это не должно быть -2 в обоих случаях? Loop, который создает дубликаты и вставляет их в отсортированный массив, в C Асинхронный ReadDirectoryChangesW – GetQueuedCompletionStatus всегда время ожидания Как работают двойные указатели (struct tree_st ** root)? Как я могу явно дождаться TCP ACK перед продолжением? В чем разница между массивами массивов и многомерными массивами? Могу ли я увеличить размер статически выделенного массива? Требуется ли синхронизация / флеш до записи в заблокированный файл из нескольких streamов / процессов в режиме fopen a +? PE File Parsing c / c ++ Почему printk () непрерывно печатает внутри syslog, когда функция ядра, в которой он находится, не вызывается (за ftrace)? Когда-то, когда> было быстрее, чем <… Подождите, что?

Почему хранилища 255 в переменной char дают значение -1 в C?

Я читаю книгу C, и есть текст, который автор упомянул:

« if ch (a char variable) is a signed type, then storing 255 in the ch variable gives it the value -1 ».

Может ли кто-нибудь уточнить это?

Предполагая, что 8-битный char s, это фактически поведение, определяемое реализацией. Значение 255 не может быть представлено как подписанное 8-битовое целое число.

Однако большинство реализаций просто сохраняют бит-шаблон, который для 255 равен 0xFF . С интерпретацией двух дополнений в качестве подписанного 8-битного целого числа, то есть битового шаблона -1 . В более редкой архитектуре-дополнении это будет битовая диаграмма отрицательного нуля или представления ловушки со знаком и величиной, это будет -127 .

Если одно из двух предположений (подпись и 8-бит char s) не выполняется, значение будет равно 255, поскольку 255 представляется в виде неподписанного 8-битного целого числа или в виде подписанного (или беззнакового) целого числа с более чем 8 биты.

¹ Стандарт гарантирует, что CHAR_BIT не менее 8, он может быть больше.

Это не гарантированное поведение. Чтобы процитировать ANSI / ISO / IEC 9899: 1999 §6.3.1.3 (преобразование между целыми числами без знака и без знака), пункт 3:

 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised. 

Я оставлю объяснения дополнения поразрядного / 2 к другим ответам, но совместимые со стандартами signed char даже не гарантированно будут слишком маленькими, чтобы удерживать 255; они могут работать очень хорошо (давая значение 255.)

Попробуйте в десятичной системе. Предположим, что у нас есть только 3 цифры. Таким образом, наш диапазон без знака равен 0 – 999.

Давайте посмотрим, может ли 999 действительно вести себя как -1 (подписанный):

 42 + 999 = 1041 

Поскольку мы можем иметь только 3 цифры, мы бросаем цифру наивысшего порядка (перенос):

 041 = 42 - 1 

Это общее правило, применимое к любой базе чисел.

Вот как работает два дополнения. Прочитайте все об этом здесь .

У вас есть classическое объяснение в других сообщениях. Я даю вам правило:

В подписанном типе с размером n наличие MSB, установленного как 1, должно интерпретироваться как -2 ^ (n-1).

Для этого конкретного вопроса, предполагая, что размер char равен 8 бит (1 байт), 255 для двоичного значения равен:

 1*2^(7) + 1*2^(6) + 1*2^(5) + 1*2^(4) + 1*2^(3) + 1*2^(2) + 1*2^(1) + 1*2^(0) = 255 255 equivalent to 1 1 1 1 1 1 1 1. 

Для unsigned char вы получаете 255, но если вы имеете дело с char (то же, что и с подписанным символом), MSB представляет отрицательную величину:

 -1*2^(7) + 1*2^(6) + 1*2^(5) + 1*2^(4) + 1*2^(3) + 1*2^(2) + 1*2^(1) + 1*2^(0) = -1