网站首页 > 技术文章 正文
正如资源总是有限的,表示二进制的内存单元也总是有限的,这就是所谓的有限字长的二进制表示。
所以,不管是定点数,还是浮点数,其长度总是有限的,总是有向上或向下溢出的可能。
1 整数向上、向下溢出
#include <stdio.h>
#include <limits.h>
void signedIntOverflow()
{
printf("%d\n",INT_MAX); // 2147483647
signed int data = 0x7fffffff; // (1<<31)-1
printf("%d\n",data); // 2147483647
data+=1;
printf("%d\n",data); // -2147483648
}
void signedIntUnderflow()
{
printf("%d\n",INT_MIN); // -2147483648
signed int data = 0x80000000; // 1<<31
printf("%d\n",data); // -2147483648
data-=1;
printf("%d\n",data); // 2147483647
}
void unsignedIntOverflow()
{
unsigned int data = 0xffffffff; // (1<<32)-1
printf("%u\n",data); // 4294967295
data+=1;
printf("%u\n",data); // 0
}
int main()
{
signedIntOverflow();
printf("\n");
signedIntUnderflow();
printf("\n");
unsignedIntOverflow();
getchar();
return 0;
}
2 浮点数的向上、向下溢出
#include <stdio.h>
void floatNotAccurate()
{
float d1=2.001;
float d2=0;
printf("d1 的初始值:2.001\n");
for (int i=0; i<1000; i++)
{
d2+=d1 ;
}
printf("d1加1000次后的值:%10.30f\n",d2);
// d1 的初始值:2.001
// d1加1000次后的值:2000.983886718750000000000000000000
}
void floatPrecision()
{
// 1、默认只显示小数点后六位,如果需 要显示更多为,需要通过宽度格式符控 制,
// 2、单精度本系统精度为6位,6位以内 准确表示.
// 3、双精度小数点后15位有效,15位以 内精确表示。
//-------------------------
double d1=3.1234567890123456789;
double d2=3.1234567890123452789;
double d3=1.1234567890123456789; //小数点后15位内能够准确表示,15 位以后无法准确
double d4=1.1234567890123452789;
float f1=3.1234567890;
float f2=3.1234564890;
float f3=1.1234567890;
float f4=1.1234564890; //小数点6位内能够准确表示表示,7位以后无法准 确
printf("查看双精度第16位的四舍五入以及15位以后的数据:\n");
printf("d1的值:%20.19f\n",d1);
printf("d2的值:%20.19f\n\n",d2);
printf("d3的值:%20.19f\n",d3);
printf("d4的值:%20.19f\n\n",d4);
printf("查看单精度第6位的四舍五入 以及6位以后的数据:\n");
printf("f1的值:%20.19f\n",f1);
printf("f2的值:%20.19f\n\n",f2);
printf("f3的值:%20.19f\n",f3);
printf("f4的值:%20.19f\n",f4);
/*
查看双精度第16位的四舍五入以及15位以后的数据:
d1的值:3.1234567890123457000
d2的值:3.1234567890123452000
d3的值:1.1234567890123457000
d4的值:1.1234567890123452000
查看单精度第6位的四舍五入 以及6位以后的数据:
f1的值:3.1234567165374756000
f2的值:3.1234564781188965000
f3的值:1.1234568357467651000
f4的值:1.1234564781188965000
*/
}
void floatUnderFlow()
{
//如果实际要表示的数要比规格化的1.175494351 e-38 小得多
//内存表示为0,可通过查看变量值看到
int i;
float fmin=1.175494351e-38;
printf("%.330f\n",1.175494351e-320);
printf("%.340f\n",1.175494351e-330);
/*
0.000000000000000000000000000000000000000000000000000000000000000000000000000000 //78
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
011753821715 //12
0.000000000000000000000000000000000000000000000000000000000000000000000000000000 //78
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
00000000000000000000000000000000000000000000000000000000000000000000000000000000 //80
0000000000000000000000 //22
*/
}
void floatOverflow()
{
float fmax=3.402823466e+38; //测试上溢
printf("fmax=3.402823466e+38\n指数格式输出值:%e\n浮点数输出值:%f\n \n",fmax,fmax);
fmax=3.4028234e+38; //测试上溢
printf("fmax=3 .4028234e+38\n指 数格式输出值:%e\n浮点数输出值:%f\n \n",fmax,fmax);
fmax=3.4028235e+38;//测试上溢
printf("fmax=3 .4028235e+38\n指 数输出数值:%e\n浮点格式输出值:%f\n \n",fmax,fmax);
fmax= 3.4028236e+38;//测试上溢
printf("fmax=3 .4028236e+38\n指 数输出数值:%e\n浮点格式输出值:%f\n \n",fmax,fmax);
fmax=-3.4028236e+38;//测试上溢
printf("fmax=-3.4028236e+38\n 指数输出数值:%e\n浮点格式输出值:%f \n\n",fmax,fmax);
/*
fmax=3.402823466e+38
指数格式输出值:3.402823e+038
浮点数输出值:340282346638528860000000000000000000000.000000 // 小数点前39位
fmax=3 .4028234e+38
指数格式输出值:3.402823e+038
浮点数输出值:340282346638528860000000000000000000000.000000
fmax=3 .4028235e+38
指数输出数值:3.402823e+038
浮点格式输出值:340282346638528860000000000000000000000.000000
fmax=3 .4028236e+38
指数输出数值:1.#INF00e+000
浮点格式输出值:1.#INF00
fmax=-3.4028236e+38
指数输出数值:-1.#INF00e+000
浮点格式输出值:-1.#INF00
*/
}
main()
{
floatUnderFlow();
floatOverflow();
floatNotAccurate();
floatPrecision();
getchar();
}
-End-
- 上一篇: 格式串详解中你不知道的知识
- 下一篇: 畅谈计算机整数,浮点数存储和运算
猜你喜欢
- 2025-01-18 FX3U小数运算
- 2025-01-18 JAVA中的浮点数与二进制
- 2025-01-18 「创新班」007. float()函数 -- 把数字字符串(或整数)转为浮点数
- 2025-01-18 谈谈小数的表示方法之定点数
- 2025-01-18 浮点数/小数 的6种舍入方式
- 2025-01-18 NOI / 1.1编程基础之输入输出
- 2025-01-18 S7-200 SMART 数据类型(上)
- 2025-01-18 西门子PLC数据类型——浮点数
- 2025-01-18 畅谈计算机整数,浮点数存储和运算
- 2025-01-18 格式串详解中你不知道的知识
- 02-21走进git时代, 你该怎么玩?_gits
- 02-21GitHub是什么?它可不仅仅是云中的Git版本控制器
- 02-21Git常用操作总结_git基本用法
- 02-21为什么互联网巨头使用Git而放弃SVN?(含核心命令与原理)
- 02-21Git 高级用法,喜欢就拿去用_git基本用法
- 02-21Git常用命令和Git团队使用规范指南
- 02-21总结几个常用的Git命令的使用方法
- 02-21Git工作原理和常用指令_git原理详解
- 最近发表
- 标签列表
-
- cmd/c (57)
- c++中::是什么意思 (57)
- sqlset (59)
- ps可以打开pdf格式吗 (58)
- phprequire_once (61)
- localstorage.removeitem (74)
- routermode (59)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- log.warn (60)
- cannotinstantiatethetype (62)
- js数组插入 (83)
- resttemplateokhttp (59)
- gormwherein (64)
- linux删除一个文件夹 (65)
- mac安装java (72)
- reader.onload (61)
- outofmemoryerror是什么意思 (64)
- flask文件上传 (63)
- eacces (67)
- 查看mysql是否启动 (70)
- java是值传递还是引用传递 (58)
- 无效的列索引 (74)