前言
在最近的学习中,遇到了一个疑惑,三组16进制的数据分别为0xFF,0xF3,0x2A
;这三组16进制的数分别表示一个24bit的16进制数据的高/中/低
三位,即为0xFFF32A
这一个16进制数据
通过网络上的16进制转10进制计算器计算得出0xFFF32A = 16773930
,但在本地程序中通过16进制转10进制得到的结果为0xFFF32A = -68822
,咨询了朋友后才知道在程序中0xFFF32A
是一个signed char
类型的数据.
signed char类型的16进制数据如何转成带符号的10进制数?
仍按照0xFFF32A
为例子,我把数据按照8bit一组来分割,分割为 高位0xFF
/中位0xF3
/低位0x2A
然后将这三个数使用网络上的16进制转10进制计算器分别计算得出高位255
/中位243
/低位42
通过查询资料可知signed char类型可表示-128~127
共计256个数,那么可以将高于127
的数进行一个减法运算
即高位255 - 256 = -1
/中位243 - 256 = -13
/低位42
;
然后分别将这高/中/低位的三个数分别乘上对应位置的倍数0x10000
/0x100
/0x1
(转换为10进制即为65536
/256
/1
)
最后将三个结果相加即可:-1*65536 + -13*256 + 42*1 = -68822
手动计算结果与程序计算结果一致.
总结
signed char类型的16进制数据转成带符号的10进制是我在学习C++过程中遇到的一个问题,手动换算方法也是我通过查询各种资料琢磨出来的,可能方法比较麻烦,欢迎各位大佬提供更加简单明了的方法~