%d和%zd的使用导致的不同

问题遇到的现象和发生背景

C语言中,%d的使用会出现警告和提醒,该用%zd后没问题,我想知道%d和%zd有什么不同,上网看到的都不太清楚,其中提到了size_t,这个与这个问题有什么关系吗?

问题相关代码,请勿粘贴截图

int main()
{
int ahh[12] = { 3,23,22 };
printf("%d\n", sizeof(ahh));

return 0;

}

运行结果及报错内容

前后都是48,但是用%d会有两个警告

警告 C4477 “printf”: 格式字符串“%d”需要类型“int”的参数,但可变参数 1 拥有了类型“size_t”
警告 C6328 大小不匹配: 已将“unsigned __int64”作为 Param(2) 传递,但需要使用“int”来调用“printf”。

我的解答思路和尝试过的方法
我想要达到的结果

(int)sizeof 试一下这样,不回出现警告,由于类型原因问题

你好,我刚刚看书也遇到了这个问题,我是这样理解的:对于编译器来说%d的转换说明是int类型,网上提到的size_t定义是unsigned int 64位(无符号64位整数),如果尝试使用%d读取这个值,你可能会输入负数,导致错误编译,为了严谨性,选择了把sizeof定义成一个类型,用%zd格式。