异或^ ,总线错误bus error

  1. 两个数交换,你想到怎么写呢,应用层的人大概只听说过利用另一个变量进行暂存值,还有哪些方法呢?  
  2.   作为底层学习人员我想你必须知道利用数的位操作,  
  3.     *a ^= *b;  
  4.     *b ^= *a;  
  5.     *a ^= *b;  
  6.     (貌似异或有个直接的什么电路,几部电路就达到了 目得)  
  7.     (书上还写了如果两个相等 则它们两个的值均为0 ,我百思不能其解,用笔算也是交换啊,怎么会变成0,很疑惑)  
  8.     这三步就是利用位操作进行的交换操作,当然也可以写成这样      
  9.      *a ^= *b ^= *a ^= *b; 这并不是装B的表现(如果你是学习应用层这个完全不用了解),就如上一篇中CDEL混乱版本,有太多值得你学习  
  1. <pre class="cpp" name="code">           我们这里 int a =12,b = 55;  
  2.                    int *p[] = {&a,&b};  
  3.                    *p[1] ^= *p[0] ^= *p[1] ^= *p[0];(  
  4. </pre><br>  
  5. 在 Gcc 下我们发现这样并不可行(gcc下又是怎么处理这中表达式的呢,(若p[0,1]不为指针这里是可以按预想运行的)),但是裁分为下面的形式 我们发现可以按我们预想的运行,那么在vc上呢?)  
  6. <pre></pre>  
  7. <pre class="cpp" name="code">              这时我们会发现 它并不是按照我们想的那样, 这时的*p[1]将会为0  这时为什么呢?首先对其裁分:</pre><pre class="cpp" name="code"> </pre><pre class="cpp" name="code">                    *p[1] ^= *p[0];  
  8.                      *p[0] ^= *p[1];  
  9.                      *p[1] ^= *p[0];  
  10.   
  11. </pre><pre class="cpp" name="code">裁分后 可以按预想运行,看来是gcc中对上面那种连起的表达式 的处理方式不一样</pre><pre class="cpp" name="code">书上提到的 bus error ,貌似是现在的编译器 允许了还是pc机的环境所致,或者大端和小端的原因或者是老书的原因,我倒是从未遇见过#include <stdio.h>union{char apple[10];int i;}pear;int *banana = (int *)&(pear.apple[1]);int main(){return 0;}在网上我找到这样的答案:http://topic.csdn.net/t/20031110/19/2446753.html 我们经常会发现有两种内存转储(core dump) 一种是段错误(segment error)通常是在一个非法的地址上进行取值赋值操作造成。 一种是总线错误(bus error)通常时指针强制转换,导致CPU读取数据违反了一定的总线规则。 下面请大家讨论一下总线错误 有例子如下sizeof(int)==4: #include <stdio.h&gt; #include <stdlib.h> int main() { int i[5]; int j; i[0]=65536+2; i[1]=65536*3+4; j=*((int *)((char *)i+2)); /* 1 bus error */ printf( "size of int is %d\nj=%d ",sizeof(int),j); return 0; } 我们姑且不考字节序问题,不管j结果是几. 在一般RISC的CPU上,一般的unix机器上都会出现bus error。 而在windows机器上,我用了vc的cl borland的bcc32和gnu的gcc编译执行都没问题。 大家有兴趣可以讨论一下 在函数调用过程时,过程活动记录,每个函数一个栈</pre><pre class="cpp" name="code"></pre><pre class="cpp" name="code"></pre><pre class="cpp" name="code"></pre> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值