对于有符号数,最高位为其符号位,底层为补码表示法(现在还有非补码表示的吗) 。
那么对于 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,大端法正好反过来。
无符号数和有符号数进行计算时,会直接把有符号数的补码形式当做无符号数来解答。