我正在尝试解释十六进制字节并将它们合并为有用的信息。
void processData(){
signed char data;
unsigned long a;//holds four bytes
unsigned long b;
unsigned int c;//holds two bytes
unsigned char d;//holds one byte
a=readA();//readA,readB,readC,readD return one unsigned byte;
b=readB();
c=readC();
d=readD();
data=(signed char) ((0xffffffff-((a<<24)|(b<<16)|(c<<8)|(d)))/1000);
}
场景是接收到的整个包包含一个四字节的信息,例如0xAABBCCDD的值。readA() 将返回包中的最高字节,即 0xAA。readD() 将返回 0xDD。所以我需要在使用“|”之前改变它们 把它们放在一起:(a<<24)|(b<<16)|(c<<8)|(d)
所以我的问题是,对于这句话的右手边
data=(signed char) ((0xffffffff-((a<<24)|(b<<16)|(c<<8)|(d)))/1000);
为什么当我将结果转换为签名字符时它不返回字符?当我打印出来时,一切都错了。但是,如果我设置data
为签名长,一切都是正确的。我想这是因为签名的字符不足以容纳所有信息并导致溢出。
如果我错了,请纠正我,其中的变量都((a<<24)|(b<<16)|(c<<8)|(d)))
将被隐式转换为 unsigned long,这个表达式的结果也是如此。((a<<24)|(b<<16)|(c<<8)|(d)))/1000
还将返回一个无符号长整数。然而,结果会明显更小,因为它除以 1000。
这四个字节的信息范围从 0xFFFF5037 到 0xFFFFFFFF,这也是这个表达式的结果的范围((a<<24)|(b<<16)|(c<<8)|(d)))
。
因此,除法完成后,表达式的右侧应该在 0 到 45 之间。但是当我打印结果时,一切都在跳跃。