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

#include  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? } 

请参阅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

猜测你的问题how is double number (eg 123.45) stored in a float variable or double variable or long double variable? :如果将double值(如文字“123.0”)存储到float变量中,编译器将static_cast该值,使其成为有效的float值。

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

 int main () { float foo = 123.0; } 

基本上是一样的

 int main () { float foo = static_cast(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]

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

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

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

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


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

要了解浮点变量的二进制布局如何工作,我建议您阅读相应标准化的维基百科文章 。

简而言之,所有浮点数( floatdoublelong double ,分别为half实现)由mantisse和exponent组成,用于表示数字。