首页 > 代码库 > 程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)
程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)
主要内容:无符号和有符号之间转换、两数相加溢出后数值计算
#include <stdio.h> /* 这个函数存在潜在漏洞 */ 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; }
溢出公式:
输出:
程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。