先看一段代码
#include <stdio.h>
int main(void)
{
float n1 = 3.0;
double n2 = 3.0;
long n3 = 2000000000;
long n4 = 1234567890;
printf("%.1e %.1e %.1e %.1e \n",n1,n2,n3,n4);
printf("%ld %ld \n",n3 ,n4);
printf("%ld %ld %ld %ld \n",n1,n2,n3,n4);
return 0;
}
下面是运行结果
我知道的是%ld取4个字节double是8字节float在printf中转换为double
在第三行第一个%ld取得应该是n1的前4字节,第二个%ld取得是n1的后四个字节,以此类推,那这样的话第三行的输出结果应该不是0 0,且后两个值也不会被正确打印,而应该第三行的数据第一与第三个数为0第二与第四个数为n1与n2
的后四个字节,但是现在为什么能真确打印?求大神指教。
不是啊,你传入的是n1 n2 n3 n4,所以就是这四个变量,不存在因为第一个变量只读取了一半,第二个变量对应第一个变量后一半这种事情。
你传入的又不是数组。
如果是
float a[4] = { xxx, xxx, xxx, xxx, xxx, xxx, ... };
long * arr = (long *)&a[0];
rintf("%ld %ld %ld %ld \n", arr[0], arr[1], arr[2], arr[3]);
那才会出现你说的。
另外,问题解决,请采纳。
你传入的n1n2n3n4是变量,每个变量都有一个地址,如第四个%ld取值的时候会在n4变量地址开始取值。