Используя switch
:
[int]$GeneratedNum = Get-Random -min 1 -max 101
Write-Debug $GeneratedNum
:lop Do{
switch ((Read-Host 'Take a new guess!') -as [int])
{
{$_ -eq $null}{continue}
{$_ -lt $GeneratedNum}{'Too Low';continue}
{$_ -gt $GeneratedNum}{'Too High';continue}
{$true}{'Good Job!';break lop}
}
} while($true)
typedef char byte;
Теперь можно заставить массив быть byte
с. Для всех очевидно, что Вы имели в виду, и Вы не теряете функциональности.
я знаю, что это несколько глупо, но это заставляет Ваш код считать 100%, как Вы предназначили.
При лжи о компиляторе он накажет Вас.
, Если буфер содержит данные, которые просто проходят, и Вы не будете управлять ими всегда, это не имеет значения.
Однако, если необходимо воздействовать на содержимое буфера тогда, корректное описание типа сделает код более простым. Никакой "интервал val = buf [я] & 0xff"; ерунда.
Так, думайте о том, что на самом деле данные и как необходимо использовать их.
Вы действительно заботитесь? Если Вы не делаете, просто используйте значение по умолчанию (символ) и не создавайте помехи своему коду неважным вопросом. Иначе будущих специалистов по обслуживанию оставят, задаваясь вопросом, почему Вы использовали подписанный (или неподписанный). Сделайте их жизнь более простой.
Несколько лет назад у меня была проблема с консольным приложением на C++, которое распечатало цветные символы для значений ASCII выше 128, и это было решено путем переключения от символа до неподписанного символа, но я думаю, что это было solveable при хранении символьного типа, также.
На данный момент, большая часть C/C++ функционирует символ использования, и я понимаю оба языка намного лучше теперь, таким образом, я использую символ в большинстве случаев.
Выбор int8_t по сравнению с uint8_t подобен тому, когда Вы сравниваете ptr для ПУСТОГО УКАЗАТЕЛЯ.
<час>С точки зрения функциональности, по сравнению с ПУСТЫМ УКАЗАТЕЛЕМ совпадает с по сравнению с 0, потому что ПУСТОЙ УКАЗАТЕЛЬ является #define для 0.
, Но лично, с точки зрения стиля кодирования, я принимаю решение сравнить свои указатели на ПУСТОЙ УКАЗАТЕЛЬ, потому что ПУСТОЙ УКАЗАТЕЛЬ #define означает человеку, поддерживающему код, который Вы проверяете на неверный указатель...
VS
, когда кто-то видит сравнение с 0, оно означает это, Вы проверяете на определенное значение.
<час>По вышеупомянутой причине, я использовал бы uint8_t.
Необходимо использовать или символ или неподписанный символ , но никогда символ со знаком . Стандарт имеет следующее в 3.9/2
Для любого объекта (кроме подобъекта базового класса) типа T POD, содержит ли объект допустимое значение типа T, базовые байты (1.7), составление объекта может быть скопировано в массив символьного или неподписанного символа. Если содержание массива символьного или неподписанного символа будет скопировано назад в объект, то объект должен впоследствии содержать свое исходное значение.
Лучше определить его как неподписанный символ. Infact БАЙТ типа Win32 определяется как неподписанный символ. Нет никакого различия между C & C++ между этим.
Это зависит.
, Если буфер предназначается для содержания текста, то, вероятно, имеет смысл объявлять это как массив char
и позволять платформе решить для Вас, подписывается ли это или не подписано по умолчанию. Это даст Вам наименьшее количество проблемы, передающей данные в и из библиотеки времени выполнения реализации, например.
, Если буфер предназначается для содержания двоичных данных, то он зависит от того, как Вы намереваетесь использовать его. Например, если двоичные данные являются действительно упакованным массивом образцов данных, которые подписываются, 8-разрядные измерения ADC фиксированной точки, тогда signed char
были бы лучшими.
В большинстве реальных случаев, буфер просто, что, буфер, и Вы действительно не заботитесь о типах отдельных байтов, потому что Вы заполнили буфер в объемной операции, и Вы собираетесь выдать его к синтаксическому анализатору, чтобы интерпретировать сложную структуру данных и сделать что-то полезное. В этом случае объявите это самым простым способом.
Если это на самом деле - буфер байтов на 8 битов, а не строка в локали машины по умолчанию, то я использовал бы uint8_t
. Не то, чтобы существует много машин вокруг, где символ не является байтом (или байтом октет), но создание оператора, 'это - буфер октетов', а не 'это - строка', часто полезная документация.
Если Вы намереваетесь хранить произвольные двоичные данные, необходимо использовать unsigned char
. Это - единственный тип данных, который, как гарантируют, не будет иметь никаких дополнительных битов по Стандарту C. Друг друга тип данных может содержать дополнительные биты в своем объектном представлении (который является тем, который содержит все биты объекта, вместо только тех, который определяет значение). Дополнительное состояние битов является неуказанным и не используется для хранения значений. Таким образом, при чтении использования char
некоторые двоичные данные вещи были бы сокращены к диапазону значений символа (путем интерпретации только битов значения), но могут все еще быть биты, которые просто проигнорированы, но все еще являются там и читают memcpy
. Во многом как дополнение битов в реальных объектах структуры. Тип unsigned char
, как гарантируют, не будет содержать их. Это следует 5.2.4.2.1/2
(C99 TC2, n1124 здесь):
, Если значение объекта символа типа рассматривают как целое число со знаком при использовании в выражении значение
CHAR_MIN
должно совпасть со значениемSCHAR_MIN
, и значениеCHAR_MAX
должно совпасть со значениемSCHAR_MAX
. Иначе значениеCHAR_MIN
должно быть 0, и значение [1 110] должно совпасть со значением [1 111]. значениеUCHAR_MAX
должно равняться2^CHAR_BIT − 1
От последнего предложения из этого следует, что нет никакого пространства, уехал в любые дополнительные биты. Если Вы используете char
в качестве типа своего буфера, у Вас также есть проблема переполнения: Присвоение любого значения явно к одному такому элементу, который находится в диапазоне [1 115] биты - таким образом, можно ожидать, что такое присвоение будет в порядке - но не в диапазоне char
, который является CHAR_MIN
.. CHAR_MAX
, такая реализация переполнения и причин преобразования определила результаты, включая повышение сигналов.
, Даже если бы какие-либо проблемы относительно вышеупомянутого, вероятно, не показали бы в реальных реализациях (был бы очень низкое качество реализации), Вы являетесь лучшими для использования правильного типа с начала вперед, которое является unsigned char
.
Для строк, однако, предпочтительный тип данных char
, который будет понят под функциями печати и строкой. Используя [1 121] в этих целях похож на неправильное решение мне.
Для получения дополнительной информации, читайте this proposal
, которые содержат фиксацию для следующей версии Стандарта C, который в конечном счете потребует signed char
не, имеют любые дополнительные биты также. Это уже включено в рабочий документ .
При выборке элемента в более широкую переменную это будет, конечно, расширено до знака или нет.
Если и если... Я склоняюсь к , предпочитают неподписанный, так как это чувствует больше "сырых данных", менее привлекательных для высказывания "эй, это - просто набор маленьких ints
", если я хочу подчеркнуть двоичность данных.
я не думаю, что когда-либо использовал явное signed char
для представления буфера байтов.
, Конечно, опция одной трети состоит в том, чтобы представить буфер как void *
как можно больше. Много общих вводов-выводов функционируют работа с void *
, поэтому иногда решение о том, какой целый тип использовать может полностью инкапсулироваться, который хорош.
Поскольку максимальная мобильность всегда использует неподписанный символ. Существует несколько экземпляров, где это могло сыграть роль. Сериализированные данные, совместно использованные через системы с другим типом порядка байтов сразу, приходят на ум. Когда выполнение сдвига или побитового маскирования значения является другим.