C语言高手编程技巧(免费精品资料)

C语言高手编程技巧(免费精品资料)

ID:41037185

大小:216.00 KB

页数:48页

时间:2019-08-14

C语言高手编程技巧(免费精品资料)_第1页
C语言高手编程技巧(免费精品资料)_第2页
C语言高手编程技巧(免费精品资料)_第3页
C语言高手编程技巧(免费精品资料)_第4页
C语言高手编程技巧(免费精品资料)_第5页
资源描述:

《C语言高手编程技巧(免费精品资料)》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、C语言技巧总结自增大总结:i=(i++)+(++i)i=?-   源代码:  #include  intmain()  {  inti=1,j=1,k;  i=(i++)+(++i);  printf("i=%d",i);  k=(j++)+(++j);  printf("j=%d,k=%d",j,k);  }  执行结果:  i=5  j=3,k=4  关键的汇编码片段:  movl$0x1,0xfffffff0(%ebp)  movl$0x1,0xfffffff4(%e

2、bp)  addl$0x1,0xfffffff0(%ebp)  mov0xfffffff0(%ebp),%eax  add%eax,0xfffffff0(%ebp)  addl$0x1,0xfffffff0(%ebp)   mov0xfffffff0(%ebp),%eax  mov%eax,0x4(%esp)  movl$0x8048500,(%esp)  call80482f8  addl$0x1,0xfffffff4(%ebp)  mov0xfffffff4(%ebp),

3、%eax  add0xfffffff4(%ebp),%eax  mov%eax,0xfffffff8(%ebp)  addl$0x1,0xfffffff4(%ebp)  mov0xfffffff8(%ebp),%eax  mov%eax,0x8(%esp)  mov0xfffffff4(%ebp),%eax  mov%eax,0x4(%esp)  movl$0x8048507,(%esp)  call80482f8  发现,先执行++i,最后执行i++。  i=(i++)+(

4、i++),i是不是等于2(0+0,接着i两次自加)  j=(i++)+(i++),j是不是等于0(i没自加前把值赋给了j)int,float,double之间的关联-   其实学习过编程的同学,都对这三个东西再熟悉不过了。int,又称作整型,在.net中特指的是Int32,为32位长度的有符号整型变量。float,单精度浮点数,32位长度,1位符号位,8位指数位与23位数据位,在.net中又称为Single。double,64位长度的双精度浮点数,1位符号位,11位指数位,52位数据位。它们互相的关

5、系就是:int可以稳式转换成float和double,float只能强制转换成int,但是可以隐式转换成double,double只能强制转换成float和int。  在说明问题之前,还很有必要温习一下计算机组成原理时学习到的一些知识,就是二进制补码表示以及浮点数表示。我想把一个十进制转化为二进制的方法已经不用多费唇舌,只不过为了计算方便以及消除正零与负零的问题,现代计算机技术,内存里存的都是二进制的补码形式,当然这个也没什么特别的,只不过有某些离散和点,需要特殊定义而已,比如-(2^31),这个数

6、在int的补码里表示成1000…(31个零),这个生套补码计算公式并不能得到结果(其实不考虑进位的话还真是这个结果,但是总让人感觉很怪)。再者,浮点数,其实就是把任何二进制数化成以0.1....开头的科学计数法表示而已。  废话说完,这就出现了几个问题,而且是比较有意思的问题。  1inti=Int32.MaxValue;  2floatf=i;  3intj=(int)f;  4boolb=i==j;  这里的b,是false。刚才这个操作,如果我们把float换成long,第一次进行隐式转换,第

7、二次进行强制转换,结果将会是true。乍一看,float.MaxValue是比int.MaxValue大了不知道多少倍的,然而这个隐式转换中,却造成了数据丢失。int.MaxValue,这个值等于2^31-1,写成二进制补码形式就是01111…(31个1),这个数,在表示成float计数的科学计数法的时候,将会写成+0.1111…(23个1)*2^31,对于那31个1,里面的最后8个,被float无情的抛弃了,因此,再将这个float强制转换回int的时候,对应的int的二进制补码表示已经变成了01

8、11…(23个1)00000000,这个数与最初的那个int相差了255,所以造成了不相等。  那么提出另一个问题,什么样的int变成float再变回来,和从前的值相等呢?这个问题其实完全出在那23位float的数据位上了。对于一个int,把它写成二进制形式之后,成为了个一32个长度的0、1的排列,对于这个排列,只要第一个1与最后一个1之前的间距,不超过23,那么它转换成float再转换回来,两个值就会相等。这个问题是与大小无关的,而且这个集合在int这个全集下并不连

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。