"% d" ожидает аргумент типа "int", но аргумент 2 имеет тип "long unsigned int" [-Wformat =]

Я продолжаю получать предупреждения компиляции, но я не знаю, как это исправить:

'%d' expects argument of type 'int', but argument 2 has type 'long unsigned int' [

Программа работает нормально, но я все равно получаю предупреждения компиляции:

/* Sizeof.c--Program to tell byte size of the C variable */
#include <stdio.h>

int main(void) {
    printf("\nA Char is %d bytes", sizeof( char ));
    printf("\nAn int is %d bytes", sizeof( int ));
    printf("\nA short is %d bytes", sizeof( short ));
    printf("\nA long is %d bytes", sizeof( long ));
    printf("\nA long long is %d bytes\n", sizeof( long long ));
    printf("\nAn unsigned Char is %d bytes", sizeof( unsigned char ));
    printf("\nAn unsigned int is %d bytes", sizeof( unsigned int));
    printf("\nAn unsigned short is %d bytes", sizeof( unsigned short ));
    printf("\nAn unsigned long is %d bytes", sizeof( unsigned long ));
    printf("\nAn unsigned long long is %d bytes\n",
            sizeof( unsigned long long ));
    printf("\nfloat is %d bytes", sizeof( float ));
    printf("\nA double is %d bytes\n", sizeof( double ));
    printf("\nA long double is %d bytes\n", sizeof( long double ));

    return 0;

}

Ответы

Ответ 1

sizeof возвращает size_t вам нужно использовать %zu для строки формата вместо %d. Тип целых чисел без знака size_t может варьироваться (в зависимости от платформы) и может быть не длинным без знака int во всем мире, который рассматривается в стандартном разделе проекта C99 6.5.3.4 Оператор sizeof оператора 4:

Значение результата определяется реализацией, а его тип (целочисленный тип без знака) size_t, определенный в (и других заголовках).

Также обратите внимание, что использование неправильного спецификатора формата для printf - это поведение undefined, которое описано в разделе 7.19.6.1 Функция fprintf, которая также охватывает printf в отношении спецификаторов формата, говорит:

Если спецификация преобразования недействительна, поведение undefined. 248) Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение undefined.

Обновить

Visual Studio не поддерживает спецификатор формата z:

Префикс hh, j, z и t длины не поддерживается.

в этом случае правильный спецификатор формата будет %Iu.

Ответ 2

Компилятор предупреждает вас, что вы можете потерять точность. То есть спецификатор формата, который вы используете для печати sizeof, %d, не может печатать весь диапазон size_t. Измените %d на %zu, и ваше предупреждение исчезнет.

Ответ 3

У меня была такая же проблема в Linux. одна и та же программа работает без ошибок в окнах (означает, что "% d" работает без ошибок), но для linux мне пришлось заменить все "% d" на "% lu", чтобы запустить программу.