printf (), unsigned char и% hhd - PullRequest
       5

printf (), unsigned char и% hhd

0 голосов
/ 02 июля 2018

Программа:

#include <stdio.h>
#include <limits.h>

int main( void )
{
#ifdef __CHAR_UNSIGNED__
    printf( "%d\n", __CHAR_UNSIGNED__ );
#endif
    printf( "%d\n", CHAR_MAX );
    printf( "%d\n", CHAR_MIN );
    printf( "%hhd\n", CHAR_MAX );
}

Вывод (на моем рабочем столе x86_64):

127
-128
127

Это как и ожидалось. Теперь я запустил то же самое на Raspberry Pi (ARM):

1
255
0
-1

Итак ... очевидно, я неправильно понял какой-то шаг CHAR_MAX делает свой путь к выводу, как вывод, который я ожидал в этой последней строке - прохождение CHAR_MAX до %hhd на машине с char без знака - было бы 255.

(И если вы спросите, результат будет одинаковым для (char)CHAR_MAX и (unsigned char)CHAR_MAX.)

Чего мне не хватает?

Это случилось со мной во время регрессионного тестирования моей собственной реализации printf() на Raspberry Pi, которая, кстати, делает print 255. Так что ... только одна реализация делает это правильно, и у меня есть ощущение, что это не мое ...

1 Ответ

0 голосов
/ 02 июля 2018

Формат "%hhd" предназначен для байта со знаком . Если вы передаете беззнаковый байт, то у вас технически есть неопределенное поведение . Для печати байта без знака необходимо использовать "%hhu".

То, что действительно происходит, происходит из-за того, как дополнения до двух целых чисел работают, и что 0xff равно -1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...