程序员之---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(符号和有符号之间转换、两数相加溢出后数值计算)的更多相关文章
- 程序员之---C语言细节12(指针和数组细节,"//"的可移植性说明)
主要内容:指针和数组细节,"//"的可移植性说明 #include <stdio.h> int main(int argc, char **argv) { int a[ ...
- 程序员之---C语言细节22(函数返回指针注意事项<悬空指针>、查看进程能够分配的内存大小)
主要内容:函数返回指针注意事项<悬空指针>.查看进程能够分配的内存大小 #include <stdio.h> char * favorite_fruit() { static ...
- 程序员之---C语言细节19(来找茬,由/* */ 引起的凝视错误)
主要内容:由/* */ 引起的凝视错误 有4处凝视错误 #include <stdio.h> #define N 10 //使用以下宏定义的凝视 #define BSC // #defin ...
- 程序员之--C语言细节13(二维数组和指针,&*a[i][0]的理解,数组1[e]和e[1]非常可能你没见过)
主要内容:二维数组和指针.&*a[i][0]的理解.数组1[e]和e[1] #include <stdio.h> #define NUM_ROWS 10 #define NUM_C ...
- 程序员之---C语言细节24(段错误、类型提升、sizeof 'A')
主要内容:段错误.类型提升.sizeof 'A' #include <stdio.h> int main() { union test{ char a[10]; int b; }u; i ...
- 程序员之---C语言细节18(一些奇怪表达式)
主要内容:一些奇怪表达式 #include <stdio.h> #define N 10 int main() { int a = 1; int *q = &a; int p = ...
- C语言实现两数相加2018-09-23
/*给定两个非空链表来表示两个非负整数.位数按照逆序方式存储,它们的每个节点只存储单个数字.将两数相加返回一个新的链表. 你可以假设除了数字 0 之外,这两个数字都不会以零开头. 示例: 输入:(2 ...
- .Net 程序员面试 C# 语言篇 (回答Scott Hanselman的问题)
过去几年都在忙着找项目,赶项目,没有时间好好整理深究自己在工作中学到的东西.现在好了,趁着找工作的这段空余时间,正好可以总结和再继续夯实自己的.Net, C#基本功.在05年的时候,Scott Han ...
- 程序员必须搞懂的20个Java类库和API
本文总结了日志.JSON解析.单测.XML解析.字节码处理.数据库连接池.集合类.邮件.加密.嵌入式SQL数据库.JDBC故障诊断以及序列化等20个方面的常用类库.都是你日常开发经常可能要用到的,现在 ...
随机推荐
- 282 Expression Add Operators 给表达式添加运算符
给定一个仅包含0-9的字符串和一个目标值,返回在数字之间添加了二元运算符(不是一元的) +.-或*之后所有能得到目标值的情况.例如:"123", 6 -> ["1+ ...
- Ray Wenderlich 的 Objective-C编码规范
由于我正在准备模仿饿了么这个app,到时可能有些iOS开发者参与进来.这时如果每个人的Objective-C编码风格都不一样,这样不易于保持代码一致性和难以Code Review.所以我在网上搜索到 ...
- Appium环境部署
Appium 是一个开源.跨平台的自动化测试工具,用于测试原生和轻量移动应用,支持 iOS, Android平台. 需要部署的软件:python环境.nodejs..net framework4.5. ...
- 第一次创建svn的项目的使用方法
1.第一步.在服务器上创建svn项目,将开发人人员你的账号密码添加上去. 2.第二步.开始在本地创建一个文件夹,点文件夹,右键->tortoisSVN->repo-brower 填写svn ...
- Memcached通信协议
英文水平很烂,做梦都想着能把英语学习,可以使用一口流利的英文和洋鬼子交流,顺便忽悠下自己的同胞.没有地方学习英语,看还可以,网上有很多关于计算机的英文文献,写还行,说就完全不可能了.在以后的工作中慢慢 ...
- Calendar的用法
DAY_OF_MONTH的主要作用是cal.get(DAY_OF_MONTH),用来获得这一天在是这个月的第多少天 Calendar.DAY_OF_YEAR的主要作用是cal.get(DAY_OF_Y ...
- zip相关知识梳理(一)
zip相关知识梳理(一) 经过对zip文件的长时间研究,对zip文件进行相关知识进行梳理,虽然网上很多牛人对其做了相关基础解析,但是对于特殊情况没有进行说明,比如超过4G的zip文件该以什么格式进行编 ...
- 题解 [USACO18DEC]Balance Beam
被概率冲昏的头脑~~~ 我们先将样例在图上画下来: 会发现,最大收益是: 看出什么了吗? 这不就是凸包吗? 跑一遍凸包就好了呀,这些点中,如果i号点是凸包上的点,那么它的ans就是自己(第二个点),不 ...
- pandas 处理 excel
先写下来,以免后续忘记,有很多都是之前用过的, 依旧忘!!! 嘤嘤嘤 data_file = pandas.read_excel('/imporExcel/2017_7_7.xlsx',sep = ' ...
- LINUX-关机 (系统的关机、重启以及登出 )
shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minutes & 按预定时间关闭系统 ...