有符号24bit转有符号32bit

tech2025-07-17  2

方法一:

int32_t axis_read_pulse_count(uint8_t axis_n) { uint8_t rev_regs[3]={0,0,0}; uint32_t count=0; pcd4641_read_command(axis_n,PulseCount,rev_regs); count = (((uint32_t)(rev_regs[2]))<<16) + (((uint32_t)(rev_regs[1]))<<8) + rev_regs[0]; if (count>0x7fffff) count = count - 0x1000000; // 24 bit 补码 return (int32_t)count; }

方法二:

int S24toS32(int input) { if((input&0x800000)==0x800000) //如果最高位为1,则是负数 { input |= 0xff000000; //高位补1 } return input; }

24位数据转为32位数据,其实就是负数多余位补1

int32_t (1-2147486470x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000C 0x0000000D 0x0000000E 0x0000000F …… 0x7FFFFFF8 0x7FFFFFF9 0x7FFFFFFA 0x7FFFFFFB 0x7FFFFFFC 0x7FFFFFFD 0x7FFFFFFE 0x7FFFFFFF-1 …… -214748647 --2147486480x00000000 0xFFFFFFFF 0xFFFFFFFE 0xFFFFFFFD 0xFFFFFFFC 0xFFFFFFFB 0xFFFFFFFA 0xFFFFFFF9 0xFFFFFFF8 0xFFFFFFF7 0xFFFFFFF6 0xFFFFFFF5 0xFFFFFFF4 0xFFFFFFF3 0xFFFFFFF2 0xFFFFFFF1 …… 0x80000008 0x80000007 0x80000006 0x80000005 0x80000004 0x80000003 0x80000002 0x80000001 0x80000000 从上面发现有符号计算:N+(-N)=0 比如:1+-1= 0x00000001+ 0xFFFFFFFF =0 如果为无符号计算 : N+(-N)=0x100000000,比如:1+-1= 0x00000001+ 0xFFFFFFFF =0x100000000 int24_t (1……8388607) 0x000001 0x000002 0x000003 0x000004 0000005 0x=000006 0x=000007 0x=000008 0x000009 0x00000a 0x00000b 0x00000C 0x00000D 0x00000E 0x00000F …… 0x7FFFF8 0x7FFFF9 0x7FFFFA 0x7FFFFB 0x7FFFFC 0x7FFFFD 0x7FFFFE 0x7FFFFF (-1……-8388607 --8388608) 0xFFFFFF 0xFFFFFE 0xFFFFFD 0xFFFFFC 0xFFFFFB 0xFFFFFA 0xFFFFF9 0xFFFFF8 0xFFFFF7 0xFFFFF6 0xFFFFF5 0xFFFFF4 0xFFFFF3 0xFFFFF2 0xFFFFF1 …… 0x800008 0x800007 0x800006 0x800005 0x800004 0x800003 0x800002 0x800001 0x800000 同理: 从上面发现有符号计算:N+(-N)=0 比如:1+-1= 0x000001+ 0xFFFFFF =0 如果为无符号计算 : N+(-N)=0x1000000,比如:1+-1= 0x000001+ 0xFFFFFF =0x1000000
最新回复(0)