资源描述:
《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这个全集下并不连