我正在尝试使用printf()以下方法将数字写入两位小数:
#include <cstdio>
int main()
{
printf("When this number: %d is assigned to 2 dp, it will be: 2%f ", 94.9456, 94.9456);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行该程序时,我得到以下输出:
# ./printf
When this number: -1243822529 is assigned to 2 db, it will be: 2-0.000000
Run Code Online (Sandbox Code Playgroud)
这是为什么?
谢谢.
考虑这个计划
int main()
{
float f = 11.22;
double d = 44.55;
int i,j;
i = f; //cast float to int
j = d; //cast double to int
printf("i = %d, j = %d, f = %d, d = %d", i,j,f,d);
//This prints the following:
// i = 11, j = 44, f = -536870912, d = 1076261027
return 0;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么从double/float到int的转换在第一种情况下正常工作,并且在printf中完成时不起作用?
该程序是在32位linux机器上的gcc-4.1.2上编译的.
编辑: Zach的答案似乎是合乎逻辑的,即使用格式说明符来确定从堆栈弹出的内容.但是请考虑这个后续问题:
int main()
{
char c = 'd'; // sizeof c is 1, however sizeof …Run Code Online (Sandbox Code Playgroud) 今天我有一个奇怪的问题.
代码(C++)
#include <iostream>
union name
{
int num;
float num2;
}oblong;
int main(void)
{
oblong.num2 = 27.881;
std::cout << oblong.num << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
守则(C)
#include <stdio.h>
int main(void)
{
float num = 27.881;
printf("%d\n" , num);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
问题
众所周知,C++联合可以包含多种类型的数据元素,但一次只能包含一种类型.所以基本上name oblong只会保留一部分32位的内存(因为联合中最大的类型是32位,int和float),这部分可以保存整数或浮点数.
所以我只需要将值27.881分配给oblong.num2(如上面的代码所示).但出于好奇,我访问使用oblong.num指向相同内存位置的内存.
正如预期的那样,它给了我一个不是27的值,因为浮点数和整数在内存中表示的方式是不同的,这就是为什么当我oblong.num用来访问内存部分时它会把那部分内存值当作整数来解释它整数表示方式.
我知道这种现象也会在C中发生,这就是为什么我用一个值初始化一个浮点型变量然后用%d.So 读取它.我只是尝试使用27.881你在上面看到的相同值.但是当我运行它时,会发生一些奇怪的事情,那就是我在C中获得的值与C++不同.
为什么会这样?据我所知,我从两个代码到底得到的两个值不是垃圾值,但为什么我得到不同的值?我还使用sizeof来验证C和C++整数和浮点大小,两者都是32位.因此,内存大小不会导致这种情况发生,那么是什么促使这些值的差异?
double d;
scanf("%f", &d);
printf("%f", d);
Run Code Online (Sandbox Code Playgroud)
结果:
输入:10.3
输出:0.00000
为什么?我认为输出应该是10.3 visual studio 2008.