位级运算的一些事

             对于有符号数,最高位为其符号位,底层为补码表示法(现在还有非补码表示的吗) 。

             那么对于 0110 = 0*2^3+1*2^2+1*2^1+0*2^0 = 6     1011 = 1*(-2)^3+0*2^2+1*2^1+1*2^0 = -5 这样就避免了补码-》反码-》原码-》在加个负号的复杂运算。

             移位运算,对于有符号数来说,绝大部分机器对有符号数的移位运算都解释为算术移位(而非逻辑移位,二者的区别在于负数的移位),比如, 1011》》1  = 1101   0111》》1 = 0011;发现区别了吗?O(∩_∩)O哈! 负数的右移补得是1.

             那么  -5》》1 是多少? 答案是-3;   5》》1呢?  答案是2;

             对于无符号数(unsigned修饰的), 那就简单了,逻辑和算术都没所谓,因为没区别。

             再来看一些有符号数和无符号数之间有意思的事,对于8位机,无符号最大数是255,那么有符号数呢? 整数到127,负数到-128,绝对值相加正好255。那为什么负数比正数多一个呢? 因为255是奇数被。无符号数和有符号数之间的转换会怎样呢?  

             对于8位数,(unsigned)-5 = 249  对于16位数  (unsigned)-5 = 65531  发现规律了吗?  没错 正数从1开始编码到2^n  负数从2^n(-1)开始编码到2^n+1 并且编译器对强转的解释是不计算的,只是对二进制码换了一种解释而已。这样就能理解 -5 >4u 为什么是1了。

             另附 大端法和小端法,  小端法 低位放在高位前面; 大端法 低位放在高位后面。 比如 0xfa  小端法是先放a,再放f,大端法正好反过来。

             无符号数和有符号数进行计算时,会直接把有符号数的补码形式当做无符号数来解答。

原文地址:https://www.cnblogs.com/liboyan/p/4750973.html