Что такое неподписанный символ?

Из моего тестирования это означало бы, что я мог бы запустить свое приложение 2.0 C # на .NET 4.0 с платформой .NET 4.0 (сборка 4.0 / сборник), что противоречит тем, что были упомянуты в статьях.

Вы можете запускать ваше приложение на .NET 4 с помощью сборок .NET 4. Однако всегда существует вероятность незначительного изменения поведения во время выполнения, поскольку вы не будете использовать ту же среду исполнения и фреймворк, которые вы использовали для разработки. Я подозреваю, что статья пытается предположить, что вы не получите то же самое поведение, просто установив 4.0, хотя, как вы видели, он должен работать.

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

439
задан Kirill Kobelev 23 December 2016 в 11:38
поделиться

13 ответов

В C++, существуют три отличны типы символов:

  • char
  • signed char
  • unsigned char

при использовании типов символов для [1 114] текст используйте неполное char:

  • это - тип символьных литералов как 'a' или '0'.
  • это - тип, который составляет струны до как "abcde"

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

, Если Вы используете типы символов в качестве [1 115] числа , используйте:

  • signed char, который дает Вам [по крайней мере 1 116]-127 к 127 диапазонам. (-128 к 127 распространено)
  • unsigned char, который дает Вам [по крайней мере 1 117] от 0 до 255 диапазонов.

, "По крайней мере", потому что стандарт C++ только дает минимальный диапазон значений, которые каждый числовой тип требуется, чтобы покрывать. sizeof (char) требуется, чтобы быть 1 (т.е. один байт), но байт мог в теории быть, например, 32 бита. sizeof все еще был бы отчет его размер как [1 111] - подразумевать, что Вы могли иметь sizeof (char) == sizeof (long) == 1.

519
ответ дан Deduplicator 23 December 2016 в 11:38
поделиться

Поскольку я чувствую, что это действительно требуется, я просто хочу заявить некоторые правила C и C++ (они - то же в этом отношении). Во-первых, все биты из unsigned char участвуют в определении значения если любой неподписанный символьный объект. Во-вторых, unsigned char явно указан неподписанный.

Теперь, у меня было обсуждение с кем-то о том, что происходит, когда Вы преобразовываете значение -1 из интервала типа к unsigned char. Он отказался от идеи, что получающееся unsigned char имеет весь свой набор битов к 1, потому что он волновался по поводу представления знака. Но он не имеет к. Это сразу после из этого правила, что преобразование делает то, что предназначается:

, Если новый тип не подписан, значение преобразовывается путем повторного добавления или вычитания еще одного, чем максимальное значение, которое может быть представлено в новом типе, пока значение не находится в диапазоне нового типа. (6.3.1.3p2 в проекте C99)

Это - математическое описание. C++ описывает его с точки зрения исчисления по модулю, которое уступает тому же правилу. Так или иначе, что является не гарантировано, то, что все биты в целом числе -1 являются тем перед преобразованием. Так, что мы имеем так, мы можем утверждать, что получающееся unsigned char имеет весь CHAR_BIT биты, превращенные к 1?

  1. Все биты участвуют в определении его значения - то есть, никакие дополнительные биты не происходят в объекте.
  2. Добавление только в один раз UCHAR_MAX+1 к [1 111] приведет к значению в диапазоне, а именно, UCHAR_MAX

Это достаточно на самом деле! Таким образом каждый раз, когда Вы хотите иметь unsigned char наличие всех его битов один, Вы делаете

unsigned char c = (unsigned char)-1;

, Оно также следует за этим, преобразование не просто усекающие биты высшего порядка. Удачное событие для [1 118] дополнение two состоит в том, что это - просто усечение там, но то же не обязательно верно для других представлений знака.

34
ответ дан Johannes Schaub - litb 23 December 2016 в 11:38
поделиться

неподписанный символ является основой всего разрядного обмана. Почти во ВСЕМ компиляторе для ВСЕЙ платформы неподписанным символом является просто БАЙТ. Целое число без знака (обычно) 8 битов. это можно рассматривать как маленькое целое число или пакет битов.

В склонности, как кто-то еще сказал, стандарт не определяет знак символа. таким образом, у Вас есть 3 отличных "символьных" типа: символ, символ со знаком, неподписанный символ.

2
ответ дан ugasoft 23 December 2016 в 11:38
поделиться

Неподписанный символ использует бит, который резервируется для знака регулярного символа как другое число. Это изменяет диапазон на [0 - 255] в противоположность [-128 - 127].

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

2
ответ дан 23 December 2016 в 11:38
поделиться
  • 1
    странно достаточно я нахожу 2-й намного более читаемым, и ожидал что быть Вашим примером ' readable' кодируйте когда я сначала eyeballed Ваше сообщение. I' ve никогда не понимал это восхищение 80 символами в современной практике кодирования (я понимаю историческое значение). Я обычно сохраняю его к 100chars – Karan 9 November 2008 в 17:20

Некоторое гугление нашло это , где у людей была дискуссия об этом.

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

1
ответ дан dbrien 23 December 2016 в 11:38
поделиться

С точки зрения прямых значений используется регулярный символ, когда значения, как известно, между CHAR_MIN и CHAR_MAX, в то время как неподписанный символ обеспечивает дважды диапазон на положительном конце. Например, если CHAR_BIT будет 8, диапазон регулярных char, как только гарантируют, будет [0, 127] (потому что он может быть подписан или не подписан), в то время как unsigned char будет [0, 255] и signed char будет [-127, 127].

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

4
ответ дан Yu Hao 23 December 2016 в 11:38
поделиться
  • 1
    I' m наблюдение, что ИДЕЯ обрабатывает мультилинию {@code} блок путем сворачивания строк вместе, который won' t страдают с <pre>. That' s печальный, как {@code} походил на хорошее решение не необходимости выйти из вводных каре. – seh 13 January 2011 в 15:52

Если Вам нравится использовать различные типы определенной длины и со знаком, Вы, вероятно, более обеспечены с uint8_t, int8_t, uint16_t, и т.д. просто, потому что они делают точно, что они говорят.

2
ответ дан Dark Shikari 23 December 2016 в 11:38
поделиться
  • 1
    мы не запустим goto обсуждение здесь:) я обновлю пример – Ilya 9 November 2008 в 17:31

Если Вы хотите использовать символ в качестве маленького целого числа, самый безопасный способ сделать это с int8_t и uint8_t типы.

12
ответ дан Yu Hao 23 December 2016 в 11:38
поделиться
  • 1
    Я рекомендую, чтобы кто-то со способностью сделать так объединил эти два ответа. – James 3 April 2013 в 22:35

Неподписанный символ является (неподписанным) значением байта (от 0 до 255). Можно думать о "символе" с точки зрения того, чтобы быть "символом", но это - действительно численное значение. Регулярный "символ" подписывается, таким образом, у Вас есть 128 значений, и эти значения отображаются на символы с помощью кодирования ASCII. Но в любом случае, что Вы храните в памяти, значение байта.

4
ответ дан Zac Gochenour 23 December 2016 в 11:38
поделиться

signed char имеет диапазон-128 к 127; unsigned char имеет диапазон от 0 до 255.

char будет эквивалентно или символу со знаком или неподписанному символу, в зависимости от компилятора, но отличный тип.

при использовании строк C-стиля, просто используйте char. Если необходимо использовать символы для (довольно редкой) арифметики, определите подписанный или неподписанный явно для мобильности.

5
ответ дан James Hopkin 23 December 2016 в 11:38
поделиться

Это является зависящим от реализации, поскольку стандарт C НЕ определяет со знаком из char. В зависимости от платформы символ может быть signed или unsigned, таким образом, необходимо явно попросить signed char или unsigned char, если реализация зависит от него. Просто используйте char, если Вы намереваетесь представить символы от строк, поскольку это будет соответствовать тому, что Ваша платформа вставляет строку.

различие между signed char и unsigned char - как Вы ожидали бы. На большинстве платформ, signed char будет дополнительное число 8-разрядного two в пределах от -128 к [1 110], и unsigned char будет 8-разрядное целое число без знака (0 к [1 113]). Обратите внимание, что стандарт НЕ требует, чтобы char типы имели 8 битов, только тот sizeof(char) возврат 1. Можно достигнуть число битов в символе с [1 117] в [1 118]. Существуют немногие, если любые платформы сегодня, где это будет чем-то другим, чем [1 119], все же.

существует хорошая сводка этого выпуска здесь .

, Поскольку другие упомянули, так как я отправил это, Вы - более обеспеченное использование int8_t и uint8_t, если Вы действительно хотите представить маленькие целые числа.

83
ответ дан Stefan van den Akker 23 December 2016 в 11:38
поделиться
  • 1
    Вы don' t нужна эта.NET, имеет сборку в функциональности: см. gzipstream класс. – AnthonyLambert 17 December 2008 в 12:47

char и unsigned char, как гарантируют, не будут 8-разрядными типами на всем platforms— они, как гарантируют, будут 8-разрядными или больше. Некоторые платформы имеют 9-разрядные, 32-разрядные, или 64-разрядные байты . Однако наиболее распространенные платформы сегодня (Windows, Mac, Linux x86, и т.д.) имеют 8-разрядные байты.

6
ответ дан Pang 23 December 2016 в 11:38
поделиться
  • 1
    на самом деле на Windows7 с цветом по умолчанию замышляют этот doesn' t справка - то, когда treeview теряет фокус тогда, выбрало узел, похож невыбранный и I' m неспособный видеть различие от другого узлы. – oleksa 23 October 2013 в 10:02

Что касается использований в качестве примера неподписанный символ :

неподписанный символ часто используется в компьютерной графике, которая очень часто (хотя не всегда) присваивает единственный байт каждому компоненту цвета. Распространено видеть RGB (или RGBA) цвет, представленный как 24 (или 32) биты, каждый неподписанный символ . С тех пор неподписанный символ падение значений диапазона [0,255], значения обычно интерпретируются как:

  • 0 значений общее отсутствие данного компонента цвета.
  • 255 значений 100% данного цветного пигмента.

, Таким образом, Вы закончили бы с RGB, красным как (255,0,0)-> (100%-й красный, 0%-й зеленый, 0%-й синий цвет).

, Почему бы не использовать символ со знаком ? Арифметика и разрядное смещение становятся проблематичными. Как объяснено уже, диапазон символа со знаком по существу смещается на-128. Очень простой и наивный (главным образом неиспользованный) метод для преобразования RGB к шкале полутонов должен составить в среднем все три компонента цвета, но это сталкивается с проблемами, когда значения компонентов цвета отрицательны. Красный (255, 0, 0) средние числа к (85, 85, 85) при использовании неподписанный символ арифметика. Однако, если бы значения были символ со знаком s (127,-128,-128), мы закончили бы с (-99,-99,-99), который будет (29, 29, 29) в нашем неподписанный символ пространство, которое является неправильным.

24
ответ дан Benargee 23 December 2016 в 11:38
поделиться