博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)...
阅读量:6147 次
发布时间:2019-06-21

本文共 1203 字,大约阅读时间需要 4 分钟。

主要内容:无符号和有符号之间转换、两数相加溢出后数值计算

#include 
/* 这个函数存在潜在漏洞 */float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return result;}int main(){ int i = 200 * 300 * 400 * 500; // int表示20亿左右,无符号就40亿左右 float j = (3.14 + 1e20) -1e20; // 因为表示精度有限输出结果为0 ,而这条语句输出3.14:float j = 3.14 + (1e20 -1e20); // e表示10为低的指数 long int a = 1; long long int b =10;  printf("i = %d\n",i); printf("j = %f\n",j); printf("a = %ld\n",a); printf("b = %ld\n",b); printf("\n"); /* 測试补码*/ unsigned int u = 4294967295u; int tu = (int)u; printf("u = %u, tu = %d\n", u, tu); // 无符号int的最大值和-1的补码是一样的(即无符号Umax和-1的补码同样位表示) printf("\n");// 一个有符号数映射为它对应的无符号数时,负数转换成大的正数,非负数保持不变 /* 測试转换*/ short int v = -12345; unsigned short uv = (unsigned short) v; // 强制转换改变数值。但不改变位表示(即 -12345和无符号53191位一样) printf("v = %d, uv = %u\n", v, uv); printf("\n"); float c[3]; sum_elements(c,3); // 传递0时出错 ,出现无符号和有符号转换问题 /*小结:表达式中一个数是有符号还有一个是无符号,C语言默认转换为无符号。在比較-1<0U时会有问题 */ /* 溢出计算,公式见下图 */ short a1 = -65536; short b1 = -1; printf("\n"); printf("%d\n",a1+b1); return 0;}

溢出公式:

输出:

你可能感兴趣的文章
飞翔的秘密
查看>>
Red Hat 安装源包出错 Package xxx.rpm is not signed
查看>>
编译安装mysql-5.6.16.tar.gz
查看>>
类与成员变量,成员方法的测试
查看>>
活在当下
查看>>
每天进步一点----- MediaPlayer
查看>>
PowerDesigner中CDM和PDM如何定义外键关系
查看>>
跨域-学习笔记
查看>>
the assignment of reading paper
查看>>
android apk 逆向中常用工具一览
查看>>
MyEclipse 报错 Errors running builder 'JavaScript Validator' on project......
查看>>
Skip List——跳表,一个高效的索引技术
查看>>
Yii2单元测试初探
查看>>
五、字典
查看>>
前端js之JavaScript
查看>>
Log4J日志配置详解
查看>>
实验7 BindService模拟通信
查看>>
scanf
查看>>
Socket编程注意接收缓冲区大小
查看>>
SpringMVC初写(五)拦截器
查看>>