Почему я должен использовать% u с unsigned int, и я могу использовать% i с unsigned char? - PullRequest
0 голосов
/ 28 декабря 2018

Я пытался поиграть с типами данных в C. Моей первой проблемой было printf () показывать отрицательное значение с unsigned int.Я исправил это с% u вместо% i.

Но неподписанный символ все еще работает с% i, как это возможно?

#include <stdio.h>

int main(void) {
    unsigned int a;
    unsigned char b;

    a = -7;
    b = -1

    printf("a=%u\nb=%i\n", a, b);

    return 0;
}

Ответы [ 2 ]

0 голосов
/ 28 декабря 2018

Как было сказано ранее, использование 'i' в качестве спецификатора формата некорректно для переменной типа unsigned char.

Всякий раз, когда вы не знаете, какой правильный форматдля любого конкретного (целочисленного) типа, вы можете просто взглянуть на inttypes.h, который содержит набор макросов, предназначенных для использования в переносимых строках формата.В зависимости от платформы, для которой вы разрабатываете, правильные спецификаторы формата могут отличаться (например, uint16_t может быть 'u' или 'hu', int32_t может быть 'd' или 'ld').

Вы можетелибо используйте этот заголовок как «шпаргалку», либо фактически напишите свои строки формата следующим образом:

printf("a=%"PRIu32"\nb=%"PRIu8"\n", a, b);

Обратите внимание, что для того, чтобы код был действительно переносимым, вам, конечно, также нужно использовать uint8_t вместоchar без знака и uint32_t вместо int.

0 голосов
/ 28 декабря 2018

Если вы видите, например, эту printf (и семейную) ссылку , вы увидите, что формат "%i" делает

, преобразует целое число со знаком в десятичном представлении [-]dddd.

[Акцент не мой]

Поскольку вы передаете unsigned int, выс несоответствующим спецификатором формата и значением, что приводит к неопределенному поведению .

Более того, для переменных функций аргументов (например, printf) аргументы меньше int (как например char, со знаком или без знака) повышен до int.И снова, поскольку полученное значение - int (со знаком) и вы используете формат "%u", существует несоответствие между спецификатором формата и типом аргумента.

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