乘以sizeof(char)不同于仅仅乘以char的大小

乘以sizeof(char)不同于仅仅乘以char的大小,c,sizeof,C,Sizeof,我最近在编写一些代码时遇到了一些奇怪的问题 printf("%li\n",(sizeof(char))); printf("%li\n",sizeof(4*(sizeof(char)))); 当我运行代码时,第一行打印1,第二行打印8。如果我把4乘以1,我会得到4。为什么会发生这种情况?4*sizeofchar是4,但它的大小通常与长的大小相同。在64位计算机上,它的大小是8。4*sizeofchar是4,但它的大小通常与长的大小相同。在您的64位计算机上,它的大小是8。也许您想打印4*siz

我最近在编写一些代码时遇到了一些奇怪的问题

printf("%li\n",(sizeof(char)));
printf("%li\n",sizeof(4*(sizeof(char))));
当我运行代码时,第一行打印1,第二行打印8。如果我把4乘以1,我会得到4。为什么会发生这种情况?

4*sizeofchar是4,但它的大小通常与长的大小相同。在64位计算机上,它的大小是8。

4*sizeofchar是4,但它的大小通常与长的大小相同。在您的64位计算机上,它的大小是8。

也许您想打印4*sizeofchar。那就有4个了

但是,您实际上打印了sizeof4*sizeofchar。sizeof生成存储其操作数所需的字节数

4*sizeofchar的类型是size_t,在您的系统上是64位类型,因此您的输出是8

通过打印sizeof123456*sizeoffloat,可以得到相同的结果。sizeof不会告诉您任何关于其操作数的值的信息,只是告诉您需要多少字节来存储它。

也许您是想打印4*sizeofchar。那就有4个了

但是,您实际上打印了sizeof4*sizeofchar。sizeof生成存储其操作数所需的字节数

4*sizeofchar的类型是size_t,在您的系统上是64位类型,因此您的输出是8


通过打印sizeof123456*sizeoffloat,可以得到相同的结果。sizeof不会告诉您任何关于其操作数的值的信息,只是告诉您需要多少字节来存储它。

好奇:为什么要用sizeofchar对格式说明符%li\进行编码?sizeof结果的大小类型的格式说明符是%zu!大小_t的正确C99/C11长度修饰符为z,如%zu。这就是@chux的目的-你应该使用%zu或类似的东西,而不是%li,这不能保证是正确的。我错误地认为的大小返回了一个长int。当它没有抛出任何警告或错误时,这一点得到了加强。我应该使用%zu。我在某个地方的代码中读到过它,但那是很久以前的事了,我不知道在哪里。好奇:你为什么用sizeofchar编码格式说明符%li\呢?sizeof的结果是%zu!大小_t的正确C99/C11长度修饰符为z,如%zu。这就是@chux的目的-你应该使用%zu或类似的东西,而不是%li,这不能保证是正确的。我错误地认为的大小返回了一个长int。当它没有抛出任何警告或错误时,这一点得到了加强。我应该使用%zu。我在某个地方的某个人代码中读过它,但那是很久以前的事了,我不再知道它在哪里。因为sizeofchar的结果是一个大小\u t值,所以4*sizeofchar也是一个大小\u t,sizeof4*sizeofchar是一个大小\u t的大小,在64位机器上是8。因此,我反对在您的答案中出现int,尤其是因为在我所知道的目前使用的所有64位机器上,sizeofint是4 32位而不是8。@JonathanLeffler:Alpha不是使用了ILP64位int/long指针吗?IIRC中,仍有一些在使用中,至少早期版本只有word load/store。然而,我可能错了——很久以前。@JonathanLeffler:我正在浏览,也许你能更快地找到证据:4*sizeofchar的值是4,键入size_t,而不是int。@{olafgf,jonathan}:dec alpha的sizeof int==4,sizeoflong==8。Linus在最初的Alpha端口中使用了这些,只是为了能够使用引导DEC二进制文件。后来,类型系统演变。这是在1994年圣诞节前后,因为sizeofchar的结果是一个size_t值,所以4*sizeofchar也是一个size_t,sizeof4*sizeofchar是一个size_t的大小,在64位机器上是8。因此,我反对在您的答案中出现int,尤其是因为在我所知道的目前使用的所有64位机器上,sizeofint是4 32位而不是8。@JonathanLeffler:Alpha不是使用了ILP64位int/long指针吗?IIRC中,仍有一些在使用中,至少早期版本只有word load/store。然而,我可能错了——很久以前。@JonathanLeffler:我正在浏览,也许你能更快地找到证据:4*sizeofchar的值是4,键入size_t,而不是int。@{olafgf,jonathan}:dec alpha的sizeof int==4,sizeoflong==8。Linus在最初的Alpha端口中使用了这些,只是为了能够使用引导DEC二进制文件。后来,类型系统演变。这是1994年圣诞节前后,IIRC