求C语言中从字节数组提取带符号8位数据的函数实现
解决方案
需求分析
需要实现两个函数:
- 从指定索引
index处提取带符号8位整数(对应大端格式的最高字节) - 从指定索引
index+3处提取带符号8位整数(对应小端格式的最低字节)
核心是完成符号扩展,将无符号字节转换为带符号整数时保留符号位。
函数实现
1. 提取大端格式对应字节(index位置)
int extract_signed_byte_big_endian(const unsigned char* arr, int index) { // 强制转换为signed char自动完成符号扩展,再转int保留符号 return (int)(signed char)arr[index]; }
2. 提取小端格式对应字节(index+3位置)
int extract_signed_byte_little_endian(const unsigned char* arr, int index) { return (int)(signed char)arr[index + 3]; }
原理说明
- 无符号字节(
unsigned char)的范围是0~255,带符号8位整数的范围是-128~127 - 当字节的最高位(第7位)为1时,表示负数,需要将高位全部填充为1完成符号扩展
- 使用
signed char强制转换是最简洁的方式:signed char会自动识别符号位,转换为int时会将符号位扩展到整个int的高位
示例验证
以整数500500为例,其二进制为00000000 00000111 10100011 00010100,十六进制为0x0007A314:
- 存储后
arr[index] = 0x00,调用extract_signed_byte_big_endian返回0 - 存储后
arr[index+3] = 0x14,调用extract_signed_byte_little_endian返回20
若存储的是负数-123(十六进制0xFFFFFF85):
arr[index] = 0xFF,提取后返回-1arr[index+3] = 0x85,提取后返回-123
内容的提问来源于stack exchange,提问作者HyperCoderSuperion
相关产品推荐
相关产品推荐

