• C uint8_t uint16_t 转 Java byte int


    阿德0307 Java中&0xFF是什么意思?计算机的原码、补码和反码

     一.定义 

    1.1.定义类型

    typedef   signed          char int8_t;
    typedef   signed short     int int16_t;
    typedef   signed           int int32_t;
    typedef   signed       __INT64 int64_t;
     
    /* exact-width unsigned integer types */
    typedef unsigned          char uint8_t;
    typedef unsigned short     int uint16_t;
    typedef unsigned           int uint32_t;
    typedef unsigned       __INT64 uint64_t;
    

     注:uint8_t实际上是一个char. 所以输出uint8_t类型的变量实际上输出其对应的字符,而不是数值

    1.2. C范围

    符号类型width最小值最大值
    signed char 8 bit -128 +127
    signed short 16 bit -32 768 +32 767
    signed int 32 bit -2 147 483 648 +2 147 483 647
    signed long 64 bit -9 223 372 036 854 775 808 +9 223 372 036 854 775 807
    unsigned char 8 bit 0 +255
    unsigned short 16 bit 0 +65 535
    unsigned int 32 bit 0 +4 294 967 295
    unsigned long 64 bit 0 +18 446 744 073 709 551 615

    1.3.Java范围

    类型width最小值最大值
    byte 8 bit -128 +127
    short 16 bit -32 768 +32 767
    int 32 bit -2 147 483 648 +2 147 483 647
    long 64 bit -9 223 372 036 854 775 808 +9 223 372 036 854 775 807
    char 8 bit 0 +65 535

    二.(byte)强转byte

    2.1.byte(128)为什么是-128?

    		int a = 128;
    		int b ;
    
    		System.out.println(Integer.toHexString(127));//7f
    		b= (byte) a ;
    		System.out.println(Integer.toHexString(b));//ffffff80
    		System.out.println(b);//-128
    

    2.2.在计算机系统中 数值一律用补码来表示和存储

    正整数:原码=反码=补码
    负整数:负整数反码 = 符号为1 其余各位取反
    负整数的补码 = 反码+1 符号不变
    负整数的补码转原码 = 补码减一再取反

    a. 128 原码 0000 0000 0000 0000 0000 0000 1000 0000

    b.强制类型转换为byte类型 其实就是一个强制高位截断的过程
    截断为byte类型 结果得到为 1000 0000
       Q:欸,现在 1000 0000 的最高位是1 那么表示是一个负数
       A: 负数在计算机中都是以补码的形式保存的

    c.1000 0000 = ~1000 0000 + 1
    = 0111 1111 + 1
    = 1000 0000

    所以10000000其真值为 0、也就是 -0 的原码为10000000  用-0来代表最低位

    2.3.Reson

    byte类型的数字要&0xff再赋值给int类型 本质原因就是想保持二进制补码的一致性

    当byte要转化为int的时候 高的24位必然会补1 这样 其二进制补码其实已经不一致了
    &0xff可以将高的24位置为0 低8位保持原样 这样做的目的就是为了保证二进制数据的一致性

    // CRC校验
    uint16_t Dev_CRC16(QByteArray ba)
    {
        uint8_t val;
        uint16_t i, j;
        uint16_t CurVal;
        uint16_t CrcReg = 0xFFFF;
     
        for (i = 0; i < ba.size(); i++)
        {
            val = (uint8_t)ba.at(i);
            CurVal = val << 8;
     
            for (j = 0; j < 8; j++)
            {
                if ((short)(CrcReg ^ CurVal) < 0)
                {
                    CrcReg = (CrcReg << 1) ^ 0x1021;
                }
                else
                {
                    CrcReg <<= 1;
                }
                CurVal <<= 1;
            }
        }
     
        return CrcReg;
    }
    
    
    
        /**
         * CRC校验
         */
        public int Dev_CRC16(byte[] ba) {
            int val;//0xff
            int i, j;
            int CurVal;//0xffff
            int CrcReg = 0xFFFF;
     
            for (i = 0; i < ba.length; i++) {
                //uint8_t -> int
                val = ba[i] & 0xff;
                CurVal = val << 8;
     
                for (j = 0; j < 8; j++) {
                    if ((short) (CrcReg ^ CurVal) < 0) {
                        CrcReg = (((CrcReg << 1) & 0xffff) ^ 0x1021);
                        //Log.d("gatsby","file_arry i-> " + i + " CrcReg -> " + CrcReg);
                    } else {
                        CrcReg = (CrcReg << 1) & 0xffff;
                    }
                    CurVal <<= 1;
                }
            }
            return CrcReg;
        }
    

      

  • 相关阅读:
    10、代码块、构造代码块、静态代码块及main方法之间的关系
    2.0、Hibernate框架的简单搭建
    1.0、Struts2的简单搭建方法
    5、Servlet的使用
    angular组件之间的通信
    angular项目中遇到的问题
    ng-zorro-mobile中遇到的问题
    angular管道操作符的使用
    angular路由配置以及使用
    搭建Angular环境
  • 原文地址:https://www.cnblogs.com/crushgirl/p/15826167.html
Copyright © 2020-2023  润新知