Из моего тестирования это означало бы, что я мог бы запустить свое приложение 2.0 C # на .NET 4.0 с платформой .NET 4.0 (сборка 4.0 / сборник), что противоречит тем, что были упомянуты в статьях.
blockquote>Вы можете запускать ваше приложение на .NET 4 с помощью сборок .NET 4. Однако всегда существует вероятность незначительного изменения поведения во время выполнения, поскольку вы не будете использовать ту же среду исполнения и фреймворк, которые вы использовали для разработки. Я подозреваю, что статья пытается предположить, что вы не получите то же самое поведение, просто установив 4.0, хотя, как вы видели, он должен работать.
Выполнение этого, вероятно, хорошо, хотя я рекомендовал бы провести тщательное тестирование вашего приложения, если это будет стандартный вариант развертывания.
В 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
.
Поскольку я чувствую, что это действительно требуется, я просто хочу заявить некоторые правила C и C++ (они - то же в этом отношении). Во-первых, все биты из unsigned char
участвуют в определении значения если любой неподписанный символьный объект. Во-вторых, unsigned char
явно указан неподписанный.
Теперь, у меня было обсуждение с кем-то о том, что происходит, когда Вы преобразовываете значение -1
из интервала типа к unsigned char
. Он отказался от идеи, что получающееся unsigned char
имеет весь свой набор битов к 1, потому что он волновался по поводу представления знака. Но он не имеет к. Это сразу после из этого правила, что преобразование делает то, что предназначается:
, Если новый тип не подписан, значение преобразовывается путем повторного добавления или вычитания еще одного, чем максимальное значение, которое может быть представлено в новом типе, пока значение не находится в диапазоне нового типа. (
6.3.1.3p2
в проекте C99)
Это - математическое описание. C++ описывает его с точки зрения исчисления по модулю, которое уступает тому же правилу. Так или иначе, что является не гарантировано, то, что все биты в целом числе -1
являются тем перед преобразованием. Так, что мы имеем так, мы можем утверждать, что получающееся unsigned char
имеет весь CHAR_BIT
биты, превращенные к 1?
UCHAR_MAX+1
к [1 111] приведет к значению в диапазоне, а именно, UCHAR_MAX
Это достаточно на самом деле! Таким образом каждый раз, когда Вы хотите иметь unsigned char
наличие всех его битов один, Вы делаете
unsigned char c = (unsigned char)-1;
, Оно также следует за этим, преобразование не просто усекающие биты высшего порядка. Удачное событие для [1 118] дополнение two состоит в том, что это - просто усечение там, но то же не обязательно верно для других представлений знака.
неподписанный символ является основой всего разрядного обмана. Почти во ВСЕМ компиляторе для ВСЕЙ платформы неподписанным символом является просто БАЙТ. Целое число без знака (обычно) 8 битов. это можно рассматривать как маленькое целое число или пакет битов.
В склонности, как кто-то еще сказал, стандарт не определяет знак символа. таким образом, у Вас есть 3 отличных "символьных" типа: символ, символ со знаком, неподписанный символ.
Неподписанный символ использует бит, который резервируется для знака регулярного символа как другое число. Это изменяет диапазон на [0 - 255] в противоположность [-128 - 127].
Вообще неподписанные символы используются, когда Вы не хотите знак. Это будет иметь значение при выполнении вещей как смещающиеся биты (сдвиг расширяет знак), и другие вещи при контакте с символом как байт вместо того, чтобы использовать его в качестве числа.
Некоторое гугление нашло это , где у людей была дискуссия об этом.
неподписанный символ является в основном единственным байтом. Так, Вы использовали бы это при необходимости в одном байте данных (например, возможно, Вы хотите использовать его для установки флагов на и прочь быть переданными функции, как часто делается в Windows API).
С точки зрения прямых значений используется регулярный символ, когда значения, как известно, между CHAR_MIN
и CHAR_MAX
, в то время как неподписанный символ обеспечивает дважды диапазон на положительном конце. Например, если CHAR_BIT
будет 8, диапазон регулярных char
, как только гарантируют, будет [0, 127] (потому что он может быть подписан или не подписан), в то время как unsigned char
будет [0, 255] и signed char
будет [-127, 127].
С точки зрения того, для чего это используется, стандарты позволяют объектам POD (простые данные) быть непосредственно преобразованными в массив неподписанного символа. Это позволяет Вам исследовать представление и комбинации двоичных разрядов объекта. Та же гарантия безопасной трамбовки типа не существует для символьного или символа со знаком.
{@code}
блок путем сворачивания строк вместе, который won' t страдают с <pre>
. That' s печальный, как {@code}
походил на хорошее решение не необходимости выйти из вводных каре.
– seh
13 January 2011 в 15:52
Если Вам нравится использовать различные типы определенной длины и со знаком, Вы, вероятно, более обеспечены с uint8_t, int8_t, uint16_t, и т.д. просто, потому что они делают точно, что они говорят.
Если Вы хотите использовать символ в качестве маленького целого числа, самый безопасный способ сделать это с int8_t
и uint8_t
типы.
Неподписанный символ является (неподписанным) значением байта (от 0 до 255). Можно думать о "символе" с точки зрения того, чтобы быть "символом", но это - действительно численное значение. Регулярный "символ" подписывается, таким образом, у Вас есть 128 значений, и эти значения отображаются на символы с помощью кодирования ASCII. Но в любом случае, что Вы храните в памяти, значение байта.
signed char
имеет диапазон-128 к 127; unsigned char
имеет диапазон от 0 до 255.
char
будет эквивалентно или символу со знаком или неподписанному символу, в зависимости от компилятора, но отличный тип.
при использовании строк C-стиля, просто используйте char
. Если необходимо использовать символы для (довольно редкой) арифметики, определите подписанный или неподписанный явно для мобильности.
Это является зависящим от реализации, поскольку стандарт 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
, если Вы действительно хотите представить маленькие целые числа.
char
и unsigned char
, как гарантируют, не будут 8-разрядными типами на всем platforms— они, как гарантируют, будут 8-разрядными или больше. Некоторые платформы имеют 9-разрядные, 32-разрядные, или 64-разрядные байты . Однако наиболее распространенные платформы сегодня (Windows, Mac, Linux x86, и т.д.) имеют 8-разрядные байты.
Что касается использований в качестве примера неподписанный символ :
неподписанный символ часто используется в компьютерной графике, которая очень часто (хотя не всегда) присваивает единственный байт каждому компоненту цвета. Распространено видеть RGB (или RGBA) цвет, представленный как 24 (или 32) биты, каждый неподписанный символ . С тех пор неподписанный символ падение значений диапазона [0,255], значения обычно интерпретируются как:
, Таким образом, Вы закончили бы с 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) в нашем неподписанный символ пространство, которое является неправильным.