即时试图提取从存储在int变量的十六进制值的4个字节。
我的想法是“推”,通过使用向右移位运算符(>>)希望字节到最后,然后使用AND运算符使用0xFF值来获得唯一的价值最后8位。与数值其工作正常(73例如),但其不与值A-F(3F例如)工作。我一直在使用不同格式的printf,比如%02X试过,我也试图改变的面具和运营商0x000000FF。
int variable = 0x12cd34f4;
char byte0, byte1, byte2, byte3;
byte0 = (char)(variable & 0xFF);
byte1 = (char)((variable >> 8) & 0xFF);
byte2 = (char)((variable >> 16) & 0xFF);
byte3 = (char)((variable >> 24) & 0xFF);
printf("%x\n",byte0);// prints fffffff4
printf("%x\n",byte1);// prints 34
printf("%x\n",byte2);//prints ffffffcd
printf("%x\n",byte3);//prints 12
我期望它来打印F4为字节0,34字节1,CD的字节2和12字节3,但对于字节0实际产量FFFFFFF4和字节2个ffffffcd。我不明白为什么添加这些的F值,以及我怎样才能摆脱他们。
char
可符号或无符号,即依赖于系统(并且,也许,以及依赖于编译器选项)。
你的情况,这显然是signed
。 0x80
和0xFF
(而不仅仅是从0xA0
开始!)之间的值有位#7组和被解释为符号值(例如,0xFF的是-1,0XF0是-16,等)。
当扩展他们int
(这是调用printf()
时会发生什么),它们是符号扩展(这是什么F
s来自),从而保持其“解读价值”。 printf()
,然而,被告知要再次把他们当作无符号,所以-16被表示为0xFFFFFFF0
。
要么使用unsigned char
RESP。 uint8_t
或致电& 0xFF
时添加printf()
。
正义的力量字符是无符号:
#include <stdio.h>
int main()
{
int variable = 0x12cd34f4;
unsigned char byte0, byte1, byte2, byte3;
byte0 = (char)(variable & 0xFF);
byte1 = (char)((variable >> 8) & 0xFF);
byte2 = (char)((variable >> 16) & 0xFF);
byte3 = (char)((variable >> 24) & 0xFF);
printf("%x\n",byte0);
printf("%x\n",byte1);
printf("%x\n",byte2);
printf("%x\n",byte3);
}
编译和执行:
pi@raspberrypi:/tmp $ gcc -pedantic -Wextra c.c
pi@raspberrypi:/tmp $ ./a.out
f4
34
cd
12
需要注意的是& 0xFF
是无用的,当一个字符有8位
首先,%x
格式说明,没有任何修饰,对自己,是该类型unsigned int
,这显然你的系统是32位。
的字节F4
和CD
最显著位是1。这是符号位,所以它是符号扩展为完整的32位(因此FFFFFF
),其打印出来。
注意,当你打印出来作为%d
,你看到在游戏符号位太:
-12
52
-51
18
为了解决这个问题,可以使型unsigned char
的字节,做一个按位和与printf
每个0xFF
参数,并使用正确的格式指定为十六进制的unsigned char
,这是%hhX
。
你的字节变量声明为char
,这对大多数实现签订。当您将这些值来printf
,它不知道你通过什么样的,因为它是一个可变参数函数的确切类型。所以char
参数提升为int
。因为你有哪些是负值,他们得到符号扩展作为推广活动的一部分。
更改这些变量的类型unsigned char
。当正值然后晋升为int
不会有符号扩展。