printf не печатает правильные значения - PullRequest
3 голосов
/ 07 сентября 2011

Я написал небольшой код C.

#include<stdio.h>
int main()
{
    int a  = 0;
    printf("Hello  World %llu is here %d\n",a, 1);
    return 0;
}

Он печатает следующий вывод

Hello World 4294967296 здесь -1216225312

Со следующим предупреждением о компиляции

prog.cpp: в функции 'int main ()':

prog.cpp: 5: предупреждение: формат "% llu" ожидает тип'long long unsigned int', но аргумент 2 имеет тип 'int'

Я знаю, что мне нужно преобразовать int в long long unsigned int, но я не мог понять тот факт, почему более поздние значенияиспорчен.

Заранее спасибо

Ответы [ 5 ]

7 голосов
/ 07 сентября 2011

% llu ожидает 64-битное целое число. Но вы дали ему только 32-разрядное целое число.

Эффект в том, что то, что printf читает, «сдвигается» на 32 бита относительно того, что вы передали. Следовательно, ваша «1» не читается в правильном месте.

EDIT:

Теперь объясним вывод:

a и 1 хранятся с разницей в 32 бита, поскольку оба являются 32-разрядными целыми числами. Однако printf ожидает, что первый аргумент будет 64-разрядным целым числом. Следовательно, оно читается как a + 2^32 * 1, что в вашем случае равно 4294967296. Второе значение, которое напечатано, не определено, потому что оно прошло 1.

4 голосов
/ 07 сентября 2011

Поскольку код вызывает Неопределенное поведение .
Неопределенное поведение по сути означает, что все ставки отключены.

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

3 голосов
/ 07 сентября 2011

Формат, который вы передали printf(), приводит к тому, что он ожидает 12 байт в стеке, но вы загружаете только 8 байт. Таким образом, он читает 4 байта, которые вы не выдавали, и дает неожиданный вывод.

Убедитесь, что вы передали то, что ожидает printf(), и учли предупреждения вашего компилятора.

0 голосов
/ 07 сентября 2011

В соответствии с данным форматом printf считывает область памяти 64-битной длины, которая содержит a и 1 вместе, печатает 4294967296. Затем он считывает некоторое количество ненужных из следующих 32 бит и печатает -1216225312.

0 голосов
/ 07 сентября 2011

Длина long составляет 64 бита, поэтому происходит следующее:
1. printf захватывает 64-бит и печатает его как 1-й аргумент
2. затем он получает 32 бита со смещением 64 бити выведите его

Так как вы передаете 32-битное значение 1-му аргументу, оба значения являются мусором

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