本来C/C++标准中使用移位操作符之后出现的空位是填0的
为什么在VC6.0中的移位操作符出现空位之后填1?
我本来今天在写一个base64的加密小程序,结果发现在加密中文的时候老出错
后来才发现是移位错了比如11010010向右移4位本来应该为00001101的
但是为什么在我的VC6.0中变成了11111101了?什么情况?求大神解答

解决方案 »

  1.   

    用无符号型的数据,如 BYTE WORD DWORD, 
    带符号的最高位做为负数指示了,位移还是保留了符号位
      

  2.   

    向右移需考虑符号问题,否则就会出错,比如对-2>>1,应该等于-1,如果不考虑符号位,那成什么了?
    如果你想左边补0,必须用无符号来移位。
    虽然vc6不怎么标准,但也不至于出这么严重的错误,不要轻易怀疑一个东西,虽然它很老,但用了10多年了。
      

  3.   


    比如一个char类型,值为11010010 向右移4位
    移位之后得到的值应该为00001101吧  如果输出的话转换为10进制值为13
    但是我实际输出之后值是-3(char类型输出)或者253(整数类型输出)所以推断到移位之后值变成了11111101了
    然后我又一位一位的做逻辑比较,结果就是11111101。
      

  4.   

    对于值为11010010的char,右移四位绝对不应该等于00001101,右移1位等于原始值除以2,一个负数除以2,怎么会得到一个正数?最多等于0但对于值为00001101的BYTE,右移四位才是00001101,我觉得我上面已经说得非常清楚了,还举了个-1移位的例子,唉,不知道你有没有看我的回复,或者想一想。