`

printf中用%d输出一个float的结果

    博客分类:
  • c
 
阅读更多

在c中如果有这样一段代码 

float f =  125.5;
printf("%d\n",f);

 那么他输出的绝对不是125.5;原因是c不像java能够自动隐式转换,除非你在printf函数中的f前加一个(int)进行强转可以得到你想要的结果,那到底像上面那样写会得到什么结果又为什么呢?

 

了解一下几点知识就行

①intel CPU是little-endien

②printf这种情况下会把float转成double

③浮点数表示法

 

可以分析一下

125.5用浮点数表示法为1.1111011*2^6,在double中阶码为6+1023=1029,即100 0000 0101,尾数为111 1011,正数首位为0。那么他的二进制表示形式为:

01000000 01011111 01100000 00000000 000000000 00000000 00000000 00000000 00000000

 

little-endian存储下,低地址头4个字节为:00000000 00000000 00000000 00000000

所以输出的0;

 

如果把printf函数内部改成printf("%d  %d\n%,f);会得到什么结果呢?

 

pirntf处理的是可变参数,先按参数从右到左压入栈,然后根据格式化字符串中%、%d等顺序从栈中取数据;栈低是高位,栈顶是低位,little-endian先取的4个字节是00000000 00000000 00000000 00000000,后取得4个字节是 01000000 01011111 01100000 00000000(十进制1079992320)

那么输出的结果就是0 1079992320

 

 

 

 

分享到:
评论

相关推荐

    c语言printf()输出格式大全.doc

    - 输出一个带符号的十进制整数。 4. **%f**: 浮点数输出 (包括 float 和 double 类型)。 - 默认情况下输出 6 位小数。 5. **%e(%E)**: 浮点数指数输出 [e-(E-) 记数法]。 - `%e`: 小写字母 e 表示指数部分。 -...

    C格式化输出详解。。。。。

    - **带符号的十进制整数**:在`printf`函数中使用转换说明符`%d`或`%i`来输出带符号的十进制整数。 - 示例代码:`printf("%d", variable);` - **不带符号的十进制整数**:使用`%u`作为转换说明符来输出不带符号的十...

    C语言程序设计标准教程

    第四行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a,b值之间有一个空格。第五行的printf语句格式控制串中加入的是非格式字符逗号, 因此输出的a,b值之间加了一个逗号。第六行的...

    C语言程序设计:常见错误总结分析

    在C语言中,要求对程序中用到的每一个变量都必须定义其类型,上面程序中没有对x、y进行定义。 2. 输入输出数据的类型与所用格式说明符不一致 int a=3; float b=4.5; printf("%f %d\n", a, b); 这并不是按照赋值的...

    实验3循环结构程序设计模板.doc

    printf("其结果为%d\n",sum); return 0; } ``` 这三个问题都是关于循环结构程序设计的典型问题,需要使用循环语句来解决问题。循环结构程序设计是程序设计中的一种基本结构,广泛应用于各种程序设计领域。

    printf的格式控制的完整格式(转载)

    `printf`函数是C语言中的一个标准输出函数,用于格式化输出数据。它允许程序员自定义输出的格式,包括对齐方式、填充字符、域宽和精度等。下面是对`printf`格式控制的详细解释: 1. **%**: 开始符号 `%`是`printf`...

    你必须知道的495个C语言问题

    3.8 为什么表达式printf("%d%d",f1(),f2());先调用了f2?我觉得逗号表达式应该确保从左到右的求值顺序。 3.9 怎样才能理解复杂表达式并避免写出未定义的表达式?“序列点”是什么? 3.10在a[i]=i++;中,如果不...

    C语言基本语法归纳ppt课件.ppt

    `printf()`是一个标准库函数,用于格式化输出数据,其中`%d`用于表示十进制整数,`\n`是换行符。 在C语言中,变量的声明和初始化是非常重要的。【例1.2】展示了如何定义整型变量(int类型),并给它们赋值,然后...

    C语言FAQ 常见问题列表

    printf("%d\n", i++ * i++); 返回 49?不管按什么顺序计算, 难道不该打印出56吗? o 4.3 对于代码 int i = 3; i = i++; 不同编译器给出不同的结果, 有的为 3, 有的为 4, 哪个是正确的? o 4.4 这是个巧妙的表达式...

    《你必须知道的495个C语言问题》

    3.8 为什么表达式printf("%d %d", f1(), f2()); 先调用了f2?我觉得逗号表达式应该确保从左到右的求值顺序。 36  3.9 怎样才能理解复杂表达式并避免写出未定义的表达式?“序列点”是什么? 36 3.10 在a[i] = i...

    C语言总复习资料-绝对经典.ppt

    2. 程序结构:一个C源程序必须有且只能有一个主函数,一个C源程序可以含一个或多个子函数。C源程序的基本结构是函数。 3. 变量初始化:静态变量k1、k2进行初始化,k1是字符串,k2是字符。 4. 数据类型:C语言提供...

    2006年9月全国计算机等级考试二级C语言笔试试题.pdf

    13. 语句`printf("%d\n",z=(x%y,x/y));`中,逗号运算符优先级高于赋值运算符,所以先执行`x/y`,然后是`x%y`,最后赋值给z,因此输出3。 14. 数组`x[3][3]`是一个3x3的整数矩阵,访问`x[i][j]`相当于访问`*(x + i * ...

    华农C语言题目及答案.docx

    例如,输入一个字符并输出,或者输入两个整数进行加法运算。 7. **常量与宏定义**: - 题目中用`#define`定义了常量`PI`,这样可以在程序中使用这个符号来代表π的近似值,简化代码并提高可读性。 8. **循环与...

Global site tag (gtag.js) - Google Analytics