C语言中float64(typedef long double)打印异常问题求助
问题分析与解决方案
看起来你遇到的核心问题是**printf格式化字符串和变量类型不匹配**,导致long double类型的变量输出完全混乱,咱们一步步拆解:
1. 最关键的错误:long double的格式化符用错了
你定义的normalization是long double类型,但在printf里用了%f——这个格式符是给double类型用的!对于long double,必须用**%Lf**(注意是大写的L,小写l容易和数字1混淆)。
这就是为什么你看到的输出全是奇怪的负数、乱码,因为printf按照double的方式去解析long double的内存,完全读错了数据。
2. 代码里的其他小问题(不影响当前输出,但建议修正)
typedef unsigned int Uint16;:这个定义不对,unsigned int在大多数平台是32位,而Uint16应该是16位无符号整数。标准做法是包含<stdint.h>,直接用uint16_t类型。void main():C标准里main函数的返回类型必须是int,应该写成int main(),最后加return 0;(虽然有些编译器允许void main,但这是不标准的)。- 全局变量:你把
i和normalization定义成全局变量了,其实更推荐放在main函数内部,避免全局变量带来的意外问题。
修正后的代码
#include<stdio.h> #include<math.h> #include<stdint.h> // 引入标准整数类型 #define size 10 int main() { uint16_t i; // 用标准的16位无符号整数 long double normalization = 0; // 直接用long double,不用typedef也可以,更清晰 for (i=0; i<size; i++) { normalization += i; printf("\n--------"); printf("\n normalization %.0Lf", normalization); // 用%Lf,%.0Lf去掉小数部分,符合你的预期输出 } return 0; }
修正后的输出
-------- normalization 0 -------- normalization 1 -------- normalization 3 -------- normalization 6 -------- normalization 10 -------- normalization 15 -------- normalization 21 -------- normalization 28 -------- normalization 36 -------- normalization 45
这样就能得到你想要的累加结果啦!
内容的提问来源于stack exchange,提问作者Tony Pendleton
相关产品推荐
相关产品推荐

