我读过type-casting in C,包括隐式,显式类型转换以及整数提升。
但是在以下声明中发生了什么,
printf("%ld\n", 10000*10000);
我得到的输出为100000000
。
格式说明符%ld
是否也会导致类型转换或行为未定义?我期待获得一些垃圾值(从最大值循环),因为int的最大值是+32767。
无论上述陈述中发生什么,以下陈述都不会发生,
printf("%f\n", 5/2); //probably 5 is double ?? If yes, how's the result justified
输出为:-0.109126
。为什么呢?
答案 0 :(得分:3)
在第一种情况下:
printf("%ld\n", 10000*10000);
文字10000
是int
。在大多数系统上,int
至少为32位。因此,10000*10000
评估为100000000
,同时评估为int
。 printf
但它正在寻找long int
。所以这是未定义的行为,无论你得到了预期的结果。
在这种情况下:
printf("%f\n", 5/2);
文字5
和2
属于int
类型,因此执行整数除法,结果值2
也是int
类型。 printf
然后尝试将此int
值读为float
,从而导致未定义的行为。
答案 1 :(得分:1)
printf("%f\n", 5/2);
5/2
结果为2
(int
)。使用%f
读取,因此调用 UB 。
如果你想要正确的结果,试试这个 -
printf("%f\n", (double)5/2);
答案 2 :(得分:1)
让你的最大值为int:
#include<stdio.h>
#include <limits.h>
main()
{
printf("The maximum value of INT = %d\n", INT_MAX);
}
我的结果:
The maximum value of INT = 2147483647
答案 3 :(得分:0)
printf("%ld\n", 10000*10000);
是UB,因为"%ld"
期望与long
匹配且10000*10000
不是long
,而是int
“格式说明符%ld是否也会导致类型转换” - &gt;否
“格式说明符%ld是否也会导致行为未定义?”除少数例外(*)外,说明符和参数必须匹配类型。在可变参数函数中调用参数可以通过short
到int
之类的常规促销。
INT_MAX
的最小值为32767.通常为2147483647.
printf("%f\n", 5/2);
是UB,"%f"
期望double
和5/2
是int
。
(*)在某个地方,我认为"%d"
匹配unsigned
和"%x"
以匹配int
是例外。但无法找到它进行验证。