无符号长整型的奇怪行为

4

这段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。


5
显示格式说明符“%d”是不正确的,请改用“%llu”。 - user703016
如果你的编译器没有警告你这个问题,你应该检查你调用它时使用的参数。 - pmr
我没有传递任何参数... 我需要吗? - nareto
使用gcc编译时,应始终使用-Wall选项,-O2也不错。 - sl0815
2个回答

7

对于后者,请使用:

printf("\n x: %llu \n y: %f \n",x,y);

使用 u 来表示无符号整型(你的输出结果只是因为你使用了小值)。对于长整型,使用 ll 修饰符,否则 printf 将会使用错误的大小解码第二个参数(x),从而使用错误的地址获取 y。


同时,第一个应该是printf("\n x: %u \n y: %f \n",x,y);。 - Mihran Hovsepyan

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接