短整型、整型、长整型、浮点型、双精度长浮点型、双精度浮点型、字符型的大小

4
我想要找出(short / int / long / float / double / long double / char)的大小,所以我写了这段代码:
printf("short\t\t%d\n", sizeof(short));    
printf("int\t\t%d\n", sizeof(int));
printf("long\t\t%d\n", sizeof(long));
printf("float\t\t%d\n", sizeof(float));
printf("double\t\t%d\n", sizeof(double));  
printf("long double\t%d\n", sizeof(long double));    
printf("char\t\t%d\n", sizeof(char));   

但是输出结果是:
type            bytes
short           512
int             512
long            1024
float           1024
double          1024
long double     1024
char            256

为什么字节数这么大?难道不应该是2、8、...吗?

1
很奇怪。使用的操作系统、编译器等是什么? - OldProgrammer
添加了C标签,如果不正确请随意更正。 - Bernhard Barker
4
sizeof 返回一个 size_t 而不是一个 int,因此 %d 不适用。 - Oliver Charlesworth
你认为从 size_tint 的隐式转换会乘以256吗?为什么会这样呢? - Dan
2
@Dan:使用 %d 打印 size_t 并不会创建从 size_tint 的隐式转换。充其量,它将 size_t 的字节重新解释为 int。在最坏的情况下,它会破坏堆栈,因为违反了平台 ABI,这可能导致程序进一步出现错误、立即崩溃或其他不希望发生的影响。 - Eric Postpischil
显示剩余5条评论
2个回答

7

sizeof计算的结果为size_t,而不是int。因此使用%d是不合适的;这会导致未定义行为。

要正确地打印size_t类型的数据,我建议使用例如 printf("%zu\n", sizeof(float));之类的方式。


1
或者更好的方法是,对于 size_t 使用 %zu。理论上,未定义的行为可能会导致任何问题,但我怀疑这不是根本问题,因为我无法使用 %d 复现该问题。 - Yu Hao
相关 - C++ 中 size_t 和 int 的区别是什么? - Bernhard Barker

-1
使用格式说明符 long unsigned int 即可,它能够正常工作。 例如: printf("sizeof(long double)= %lu\n", sizeof(long double));
答案:16

1
这个回答对已接受的答案没有任何补充,事实上是错误的。不能保证“%lu”是“size_t”的正确格式说明符。 - trent
谢谢您的反馈,你可以在这里纠正我吗?一旦您提供了解决方案,我会删除我的答案。 - akshaypmurgod
size_t 可能是至少有 16 位的任何无符号类型的别名。也就是说,它可能是 unsigned shortunsigned intunsigned long 或者 unsigned long long。在“奇特”的实现中,甚至可能是 unsigned char!当调用没有原型的函数或者像 printf 这样不会为其可变参数提供原型的可变参数函数时,必须确保参数的 实际 类型与函数期望的参数类型匹配;除非 size_t 恰好是 unsigned long,否则 %lu 不是正确的格式说明符。在 C99 及更高版本中,%zu 总是有效的。 - trent
这个问题及其答案提供了更多信息。 - trent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接