Каков наилучший способ увеличения / уменьшения байта в c ++ с учетом переполнения и недостаточного заполнения? Например, у меня есть:
char c = random byte;
c += 0xB;
В случае с <= 0xF4, это будет хорошо работать, но любое значение выше, которое может вызвать переполнение. Аналогично, если бы это было c — = 0xB; и с < 0xB, будет происходить переполнение.
Скажем, c = 0xFF, после добавления это будет 0xA? Аналогично с понижением, если c = 0, будет ли результат 0xF5?
Кроме того, по некоторым странным причинам, когда я увеличиваю конкретные числа, появляются странные результаты. Например, если я увеличу 0x0 на 0xA, используя код:
c = (c + 0xA) & 0xFF;
результат: 0x0D 0x0A, а не просто 0x0A … как показано на следующем рисунке:
Пока все остальные байты увеличиваются корректно.
Я могу хотя бы объяснить ваши результаты с 0x0 by 0xA
: В Windows символ новой строки в текстовых файлах обычно представлен в виде \r\n
скорее, чем \n
и функции файлового ввода-вывода помогут сделать этот перевод для вас. В этом случае вам не нужно преобразование, поэтому вы можете открыть файл в двоичном режиме, что приведет к запрету автоматического преобразования.
Что касается обработки переполнения, если вы можете использовать unsigned char
вместо char
гарантированно иметь четко определенную арифметику по модулю для переполнения и переполнения.
Если вам нужно обрабатывать потоки со знаком или недопустимо, вам придется тщательно кодировать всю логику, которую вы хотите.