почему вывод следующей программы c -10 - PullRequest
0 голосов
/ 12 февраля 2019
#include <stdio.h>

int main() {
    unsigned int a = -10;
    printf("a=%d\n", a);

    return 0;
}

Приведенный выше код печатает -10 для подписи int.Если оба со знаком и без знака печатают -10, тогда в чем разница между ними?

Ответы [ 3 ]

0 голосов
/ 12 февраля 2019

У вас на самом деле есть неопределенное поведение в этом коде.

Формат "%d" предназначен для простого со знаком int, инесоответствие спецификатора формата и аргумента приводит к UB.

Поскольку printf не имеет никакого представления о передаваемых типах real , он должен полагаться только на спецификаторы формата.Так что, вероятно, происходит то, что функция printf просто обрабатывает значение как обычное int со знаком и печатает его как таковой.

0 голосов
/ 12 февраля 2019

Вы должны использовать

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

, чтобы напечатать "a" как целое число без знака

0 голосов
/ 12 февраля 2019

printf не знает о типе аргумента, который вы ему даете.С %d вы говорите, что это со знаком int, что неправильно.Это неопределенное поведение - все может случиться.Вероятно, случится так, что она все равно будет интерпретировать эту память как подписанную int, а с помощью unsigned int a=-10; вы установите для unsigned int значение, которое будет интерпретироваться как -10 при чтении со знаком int.Для получения дополнительной информации о том, что происходит с присвоением отрицательного числа типу без знака, проверьте этот ответ .

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