• 位级运算的一些事


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

                 那么对于 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,大端法正好反过来。

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

  • 相关阅读:
    Game Engine Architecture 3
    Game Engine Architecture 2
    补码
    工厂模式
    Game Engine Architecture 1
    YDWE Keynote
    3D Math Keynote 4
    3D Math Keynote 3
    3D Math Keynote 2
    OGRE中Any 类型的实现
  • 原文地址:https://www.cnblogs.com/liboyan/p/4750973.html
Copyright © 2020-2023  润新知