我用scanf %lf输出float为什么会影响 unsigned char short的结果?

我用scanf %lf输出float为什么会影响 unsigned char short的结果?

1 个回答

李盛林

提问:我用scanf %lf输出float为什么会影响 unsigned char short的结果?

补充 : 这样就不会影响前面的两个变量的结果

网友回答:

这个问题,一般的解释(大多老师会怎么讲),scanf的格式化符必须与变量类型匹配,否则结果是“不可预料”的,若你是新手,就记住这个规则 。

但若细究这个问题,可以得到完整的解释,但你要有相当的计算机基础知识

首先,这个结果是与编译器有关的(你若手边有多个编译器,可以测试下)

对VC++的任何版本,结果是

255 0 0.000000

而你的结果,应该用的是gcc编译器,下面我们就以gcc分析它的结果

1,gcc的局部自动变量是放在栈中的,且缺省的对齐方式是2个字节(它与结构不同,结构缺少是1字节),它可以通用__attribute((aligned (n)))来改变,要注意的是#pragma pack只能改结构中的对齐方式,不能改局部变量的对齐方式的

这样的话,c变量地址最小,a最大

设c的变量地址为off

那么

b的地址为 off+4 (c是float,它就是4个字节)

a的地址是  off+7(b是short,2个字节,因为a是1个字节,为对齐,加个1个字节)

变量的内存分配为

off+0:   ==>c off+1: off+2: off+3: off+4:   ==>b off+5: off+6: off+7:  ==>a

2,当你用%lf输入c时,实际用了double类型,它要占有8个字节,而double内部用的是IEEE754浮点标准,若输入的-1,它的值为(十六进制)BFF0000000000000(这个结果的运算过程,自己参考下IEEE754,较复杂的),因为intel的内存是小头的(小端)模式,所以实际内存为000000000000F0BF

对应上面的内存分配,实际内存的值为

off+0:0    ==>c off+1:0 off+2:0 off+3:0 off+4:0   ==>b off+5:0 off+6:F0 off+7:BF  ==>a

从上面就可以看到。对float的c,它的值为0 0 0 0,也就是0

b对应的是0 0,所以也是0

而a对应的是 BF,也就是191

所以最终的结果是

191 0 0.000000


  • 1 关注
  • 0 收藏, 浏览
  • 提出于

相似问题