unsigned long long int奇怪的行为

时间:2011-07-13 09:37:20

标签: c

这个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

2 个答案:

答案 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字节):

  1. [[03 00 00 00] (unsigned long int) [3.0] (float)]一切正确,您打印两个4字节值。
  2. [[03 00 00 00 00 00 00 00] (unsigned long long int) [3.0] (float)]在这里,您打印两个4个打印值,但实际上在您的printf接收到的缓冲区中有一个8字节值和一个4字节值,因此您只打印前8个字节: )