在打印值时了解C中的类型转换

时间:2015-10-22 17:36:13

标签: c

我读过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。为什么呢?

4 个答案:

答案 0 :(得分:3)

在第一种情况下:

printf("%ld\n", 10000*10000);

文字10000int。在大多数系统上,int至少为32位。因此,10000*10000评估为100000000,同时评估为intprintf但它正在寻找long int。所以这是未定义的行为,无论你得到了预期的结果。

在这种情况下:

printf("%f\n", 5/2);

文字52属于int类型,因此执行整数除法,结果值2也是int类型。 printf然后尝试将此int值读为float,从而导致未定义的行为。

答案 1 :(得分:1)

printf("%f\n", 5/2); 

5/2结果为2int)。使用%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)

  1. printf("%ld\n", 10000*10000);是UB,因为"%ld"期望与long匹配且10000*10000不是long,而是int

  2. “格式说明符%ld是否也会导致类型转换” - &gt;否

  3. “格式说明符%ld是否也会导致行为未定义?”除少数例外(*)外,说明符和参数必须匹配类型。在可变参数函数中调用参数可以通过shortint之类的常规促销。

  4. INT_MAX最小值为32767.通常为2147483647.

  5. printf("%f\n", 5/2);是UB,"%f"期望double5/2int

  6. (*)在某个地方,我认为"%d"匹配unsigned"%x"以匹配int是例外。但无法找到它进行验证。