Буфер байтов должен быть подписан или неподписанный символьный буфер?

Используя 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)
54
задан jackhab 17 March 2009 в 07:52
поделиться

13 ответов

typedef char byte;

Теперь можно заставить массив быть byte с. Для всех очевидно, что Вы имели в виду, и Вы не теряете функциональности.

я знаю, что это несколько глупо, но это заставляет Ваш код считать 100%, как Вы предназначили.

-1
ответ дан Matt Cruikshank 7 November 2019 в 17:54
поделиться

При лжи о компиляторе он накажет Вас.

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

Однако, если необходимо воздействовать на содержимое буфера тогда, корректное описание типа сделает код более простым. Никакой "интервал val = buf [я] & 0xff"; ерунда.

Так, думайте о том, что на самом деле данные и как необходимо использовать их.

-1
ответ дан Darron 7 November 2019 в 17:54
поделиться

Вы действительно заботитесь? Если Вы не делаете, просто используйте значение по умолчанию (символ) и не создавайте помехи своему коду неважным вопросом. Иначе будущих специалистов по обслуживанию оставят, задаваясь вопросом, почему Вы использовали подписанный (или неподписанный). Сделайте их жизнь более простой.

0
ответ дан Gorpik 7 November 2019 в 17:54
поделиться

Несколько лет назад у меня была проблема с консольным приложением на C++, которое распечатало цветные символы для значений ASCII выше 128, и это было решено путем переключения от символа до неподписанного символа, но я думаю, что это было solveable при хранении символьного типа, также.

На данный момент, большая часть C/C++ функционирует символ использования, и я понимаю оба языка намного лучше теперь, таким образом, я использую символ в большинстве случаев.

0
ответ дан schnaader 7 November 2019 в 17:54
поделиться

Выбор int8_t по сравнению с uint8_t подобен тому, когда Вы сравниваете ptr для ПУСТОГО УКАЗАТЕЛЯ.

<час>

С точки зрения функциональности, по сравнению с ПУСТЫМ УКАЗАТЕЛЕМ совпадает с по сравнению с 0, потому что ПУСТОЙ УКАЗАТЕЛЬ является #define для 0.

, Но лично, с точки зрения стиля кодирования, я принимаю решение сравнить свои указатели на ПУСТОЙ УКАЗАТЕЛЬ, потому что ПУСТОЙ УКАЗАТЕЛЬ #define означает человеку, поддерживающему код, который Вы проверяете на неверный указатель...

VS

, когда кто-то видит сравнение с 0, оно означает это, Вы проверяете на определенное значение.

<час>

По вышеупомянутой причине, я использовал бы uint8_t.

2
ответ дан Trevor Boyd Smith 7 November 2019 в 17:54
поделиться

Необходимо использовать или символ или неподписанный символ , но никогда символ со знаком . Стандарт имеет следующее в 3.9/2

Для любого объекта (кроме подобъекта базового класса) типа T POD, содержит ли объект допустимое значение типа T, базовые байты (1.7), составление объекта может быть скопировано в массив символьного или неподписанного символа. Если содержание массива символьного или неподписанного символа будет скопировано назад в объект, то объект должен впоследствии содержать свое исходное значение.

5
ответ дан Richard Corden 7 November 2019 в 17:54
поделиться

Лучше определить его как неподписанный символ. Infact БАЙТ типа Win32 определяется как неподписанный символ. Нет никакого различия между C & C++ между этим.

4
ответ дан Naveen 7 November 2019 в 17:54
поделиться

Это зависит.

, Если буфер предназначается для содержания текста, то, вероятно, имеет смысл объявлять это как массив char и позволять платформе решить для Вас, подписывается ли это или не подписано по умолчанию. Это даст Вам наименьшее количество проблемы, передающей данные в и из библиотеки времени выполнения реализации, например.

, Если буфер предназначается для содержания двоичных данных, то он зависит от того, как Вы намереваетесь использовать его. Например, если двоичные данные являются действительно упакованным массивом образцов данных, которые подписываются, 8-разрядные измерения ADC фиксированной точки, тогда signed char были бы лучшими.

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

12
ответ дан RBerteig 7 November 2019 в 17:54
поделиться

Если это на самом деле - буфер байтов на 8 битов, а не строка в локали машины по умолчанию, то я использовал бы uint8_t. Не то, чтобы существует много машин вокруг, где символ не является байтом (или байтом октет), но создание оператора, 'это - буфер октетов', а не 'это - строка', часто полезная документация.

9
ответ дан Pete Kirkham 7 November 2019 в 17:54
поделиться

Если Вы намереваетесь хранить произвольные двоичные данные, необходимо использовать 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 не, имеют любые дополнительные биты также. Это уже включено в рабочий документ .

47
ответ дан Johannes Schaub - litb 7 November 2019 в 17:54
поделиться

При выборке элемента в более широкую переменную это будет, конечно, расширено до знака или нет.

0
ответ дан pngaz 7 November 2019 в 17:54
поделиться

Если и если... Я склоняюсь к , предпочитают неподписанный, так как это чувствует больше "сырых данных", менее привлекательных для высказывания "эй, это - просто набор маленьких ints", если я хочу подчеркнуть двоичность данных.

я не думаю, что когда-либо использовал явное signed char для представления буфера байтов.

, Конечно, опция одной трети состоит в том, чтобы представить буфер как void * как можно больше. Много общих вводов-выводов функционируют работа с void *, поэтому иногда решение о том, какой целый тип использовать может полностью инкапсулироваться, который хорош.

0
ответ дан unwind 7 November 2019 в 17:54
поделиться

Поскольку максимальная мобильность всегда использует неподписанный символ. Существует несколько экземпляров, где это могло сыграть роль. Сериализированные данные, совместно использованные через системы с другим типом порядка байтов сразу, приходят на ум. Когда выполнение сдвига или побитового маскирования значения является другим.

3
ответ дан MrEvil 7 November 2019 в 17:54
поделиться