C uint8_t uint16_t 转 Java byte int
阿德0307 Java中&0xFF是什么意思?计算机的原码、补码和反码
一.定义
1.1.定义类型
1 2 3 4 5 6 7 8 9 10 | 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?
1 2 3 4 5 6 7 | 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位保持原样 这样做的目的就是为了保证二进制数据的一致性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | // 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; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效