这个C代码
unsigned long int a, b, x;
float c, d, y;
a = 6;
b = 2;
x = a/b;
c = 6.0;
d = 2.0;
y = c/d;
printf("\n x: %d \n y: %f \n",x,y);
正常工作并打印出来
x: 3
y: 3.000000
但是,当我将第一行更改为此
时unsigned long long int a, b, x;
我得到了这个输出:
x: 3
y: 0.000000
这真让我高兴...我没有用c,d和y改变任何东西 - 为什么我得到这个?我在linux上使用gcc
答案 0 :(得分:7)
对于后者使用:
printf("\n x: %llu \n y: %f \n",x,y);
使用u
表示无符号积分(您的输出只是正确的,因为您使用较小的值)。使用ll
修饰符进行long longs,否则printf将使用错误的大小来解码printf的第二个参数(x),因此它使用错误的地址来获取y。
答案 1 :(得分:2)
您应该使用:
printf("\n x: %llu \n y: %f \n", x, y);
否则会发生类似这样的事情(例如,系统unsigned long int
为4字节,unsigned long long int
为8字节,float
为4字节):
[[03 00 00 00] (unsigned long int) [3.0] (float)]
一切正确,您打印两个4字节值。[[03 00 00 00 00 00 00 00] (unsigned long long int) [3.0] (float)]
在这里,您打印两个4个打印值,但实际上在您的printf
接收到的缓冲区中有一个8字节值和一个4字节值,因此您只打印前8个字节: )