0

我是一名试图学习 C 和 C++ 的学生,我的说明符有问题 %d 我不明白控制台中写的异常,它正在写

The format %d expects argument of type 'int', but argument 2 has type 'long long unsigned int' [-Wformat]

这是代码:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    short int u=1;
    int v=2;
    long int w=3;
    char x='x';
    float y=4;
    double z=5;
    long double a=6;
    long b=7;
    printf("short int:%d\n",sizeof(u));
    printf("int:%d octets\n",sizeof(v));
    printf("long int:%d octets\n",sizeof(w));
    printf("char:%d octets\n",sizeof(x));
    printf("float:%d octets\n",sizeof(y));
    printf("double:%d octets\n",sizeof(z));
    printf("long double:%d octets\n",sizeof(a));
    printf("long:%d octets\n",sizeof(b));
    return 0;
}
4

2 回答 2

1

sizeof运算符返回一个size_t类型。这始终是未签名的,并且在您的平台上是long long unsigned int; 在其他平台上,它可能只是unsigned long或者实际上是其他一些(无符号)整数类型。

对这种类型的参数使用%zu格式说明符;无论实际的size_t类型定义是什么,这都会起作用。

于 2021-02-08T18:10:52.450 回答
1

运算符返回的值的类型sizeof是无符号整数类型size_t。转换说明符d用于输出该类型的值int。您必须使用转换说明符zu。否则你会得到未定义的行为。

例如

printf("short int:%zu\n",sizeof(u));

来自 C 标准(7.21.6.1 fprintf 函数)

9 如果转换规范无效,则行为未定义。275)如果任何参数不是相应转换规范的正确类型,则行为未定义。

于 2021-02-08T18:10:22.700 回答