C:如何将双数(例如123.45)存储在浮点变量或双变量或长双变量中?

时间:2011-06-30 13:16:50

标签: c

#include <stdio.h>

int main () {
float a = 123.0; 

unsigned char ch, *cp;
ch = 0xff;

cp = (unsigned char *) &a;
printf ("%02x", ch&(*(cp+3)));
printf ("%02x", ch&(*(cp+2)));
printf ("%02x", ch&(*(cp+1)));
printf ("%02x\n", ch&(*(cp+0)));

/*I have written this program to see binary representation, but I can not understand the output, the binary representation?
}

3 个答案:

答案 0 :(得分:9)

参见Wikipedia:http://en.wikipedia.org/wiki/Single_precision_floating-point_format,它描述了单精度浮点(典型的C float,但依赖于编译器)作为1位符号,8位偏置指数,以及24-位尾数(存储23位)。

对于你的例子:

  

123.0 = 42f60000 hex = 0 10000101 11101100000000000000000 bin
  1位符号= 0(表示正数)
  8位偏差指数= 10000101 bin = 133 dec - 127 dec = 6 dec
  23位尾数= 11101100000000000000000 bin = 1.111011 bin (注意隐含前导1)

     

转换1.111011 bin x 2 6 dec = 1111011.0 bin = 123.0 dec

答案 1 :(得分:1)

猜测你的问题 how is double number (e.g. 123.45) stored in a float variable or double variable or long double variable? :如果你将一个双值(如文字“123.0”)存储到一个浮点变量中,编译器将static_cast<float>值所以它变成了有效的浮动值。

因此,除了可能的编译器警告之外,还有以下内容

int main () {
    float foo = 123.0;
}

基本相同
int main () {
    float foo = static_cast<float>(123.0);
}

如果要显式声明float-literal,请使用fF后缀:

int main () {
    float foo = 123.0f; // alternatively: 123.f, 123.F
}

编辑:来自标准

为了好奇:

,只需查看浮动文字的语法
floating-literal:
    fractional-constant exponent-part_opt floating-suffix_opt
    digit-sequence exponent-part floating-suffix_opt

fractional-constant:
    digit-sequence_opt . digit-sequence
    digit-sequence .

exponent-part:
    e sign_opt digit-sequence
    E sign_opt digit-sequence

这里有一些不需要转换(但可能是舍入)的浮点文字的例子:

float a = 1.f,
      b = 1.0f,
      c = .0f,
      d = 1e1f,
      e = 1.e1f,
      f = 1e-1f,
      g = 1e+1f,
      h = 1E+1F;

如果需要转换,例如

float a = 1., // double
      b = 1.L,// long double
      c = 1;  // integer

以下适用:

4.8浮点转换 [conv.double]

  

浮点类型的右值可以转换为另一个浮点类型的右值。如果来源   value可以在目标类型中准确表示,转换的结果就是精确表示。   如果源值在两个相邻目标值之间,则转换结果为a   实现定义的这两个值的选择。否则,行为未定义。

4.9浮动积分转换_ [conv.fpint]:

  

整数类型或枚举类型的右值可以转换为浮点类型的右值。如果可能,结果是准确的。整数类型或枚举类型的右值可以转换为浮点的右值   类型。如果可能,结果是准确的。否则,它是下一个实现定义的选择   更低或更高的代表值。

总而言之,如果将doublelong double(或某个整数)的文字放入float,编译器将隐式转换该值,如果可以的话完全转换。否则,它与平台有关,如何存储结果;如果值超出可表示的范围,您将进入未定义行为的世界 *


* 未定义行为的可怕境界,一个邪恶的编译器作家可能会觉得通过你的扬声器发出一声低声的声音并让你流过耳朵很有趣,并且仍然受到标准(不一定是当地法律)。

答案 2 :(得分:0)

为了理解浮点变量的二进制布局如何工作,我建议你阅读相应标准化的wikipedia article

简而言之,所有浮点数(floatdoublelong doublehalf}的实现都包含一个mantisse和一个表示数字的指数