【发布时间】:2017-11-09 07:22:25
【问题描述】:
当在 c 中调用可变参数函数时,整数参数被提升为 int,浮点参数被提升为 double
由于原型没有为可选参数指定类型,因此在调用可变参数函数时,默认参数提升是在可选参数值上执行的。这意味着
char或short int类型的对象(无论是否已签名)将酌情提升为int或unsigned int;并且float类型的对象被提升为double类型。因此,如果调用者将char作为可选参数传递,则将其提升为int,并且该函数可以使用va_arg (ap, int)访问它。
int 类型在 32 位机器上应该是 4 字节,在 64 位机器上应该是 8 字节,对吗?
所以我想知道当我将long long int 传递给像 printf 这样具有%lld 格式的变量参数函数时会附加什么。
而且,我想知道当我以%Lf 格式将long double 变量传递给printf 时会附加什么(无论是在32 位还是64 位机器上)。
[已编辑]
在 32 位机器上,我试过这个:
#include <stdio.h>
int main(void)
{
printf("sizeof(int) %d\n", sizeof(int));
printf("sizeof(long int) %d\n", sizeof(long int));
printf("sizeof(long long int) %d\n", sizeof(long long int));
printf("%lld\n", 1LL<<33);
printf("sizeof(float) %d\n", sizeof(float));
printf("sizeof(double) %d\n", sizeof(double));
printf("sizeof(long double) %d\n", sizeof(long double));
return 0;
}
结果是:
sizeof(int) 4
sizeof(long int) 4
sizeof(long long int) 8
8589934592
sizeof(float) 4
sizeof(double) 8
sizeof(long double) 12
这让我觉得并非所有参数都提升为int,否则我会打印 0 而不是 8589934592。
也许只有小于int 的参数才被提升为int。浮点类型可能也有类似的情况。
[已编辑]
在 64 位机器上我运行这个:
int main(void)
{
printf("sizeof(int) %lu\n", sizeof(int));
printf("sizeof(long) %lu\n", sizeof(long));
printf("sizeof(long long) %lu\n", sizeof(long long));
return 0;
}
得到
sizeof(int) 4
sizeof(long) 8
sizeof(long long) 8
如果我理解标准,只有char 和short 被提升为int。我想知道在较小的架构中会发生什么,例如 16 位或 8 位 MCU。我认为int 的大小取决于架构,但我想知道sizeof(int) 是否可以在 8 位架构上为 1。在这种情况下,将short 升级为int 可能是不可能的,除非丢失一些位
【问题讨论】:
-
int必须至少 16 位,但标准不作进一步保证。 -
和
long long每个 C99 必须至少为 64 位 -
An
intmust be able to contain ashort。此外,该标准指定intmust be at least 16 bits,无论底层架构如何。_Bool也被提升为int。 -
添加--
short完全有可能与int大小相同,或者int与long大小相同。也可能有 16 位chars,在这种情况下,也可能有 16 位ints 和sizeof (int) == 1。这些是实现细节,不依赖于架构。 -
由于
size_t使用了错误的格式说明符,您的程序都有未定义的行为。 (应该是%zu)
标签: c floating-point int printf c99