我试图在char指针的帮助下追踪联合的第1个字节的值。我假设byte1的输出应该是ff,而不是它的ffffffff。 纠正我如果我错了。
#include <stdio.h>
#include <stdint.h>
#include <iostream>
struct TriggerMsg
{
uint32_t x[3];
uint32_t y[3];
};
struct sysData
{
union
{
TriggerMsg tTrigger;
uint8_t u8Wakeup;
uint8_t u8Reset;
}
u;
};
int main()
{
sysData sys;
for(int i =0 ; i<3 ; i++)
{
sys.u.tTrigger.x[i] = 0;
sys.u.tTrigger.y[i]= 0;
}
sys.u.u8Wakeup = 0xffffffff;
//sys.u.tTrigger = { 0 };
char *c = (char *)&(sys.u) ;
printf("u.tTrigger.x = %x \nu.tTrigger.y = %x \nu.u8Wakeup = %d \n\n" , \
sys.u.tTrigger.x[0], sys.u.tTrigger.y[0], sys.u.u8Wakeup);
for(int i=0; i<24;i++)
printf("Byte%d = %x \n", i, c[i]) ;
return 0;
}
Output:
u.tTrigger.x = ff
u.tTrigger.y = 0
u.u8Wakeup = 255
Byte0 = ffffffff
Byte1 = 0
Byte2 = 0
Byte3 = 0
Byte4 = 0
Byte5 = 0
Byte6 = 0
Byte7 = 0
Byte8 = 0
Byte9 = 0
Byte10 = 0
Byte11 = 0
Byte12 = 0
Byte13 = 0
Byte14 = 0
Byte15 = 0
Byte16 = 0
Byte17 = 0
Byte18 = 0
Byte19 = 0
Byte20 = 0
Byte21 = 0
Byte22 = 0
Byte23 = 0
我试图在char指针的帮助下追踪联合的第1个字节的值。我假设byte1的输出应该是ff,而不是它的ffffffff。 纠正我如果我错了。
答案 0 :(得分:0)
%x
格式会打印unsigned int
,但您的char
已签名。传递给signed int
时,它会被提升为printf
。当有符号整数中的负值显示为无符号时,这会导致意外输出。
将char
更改为unsigned char
以解决此问题:
unsigned char *c = (unsigned char *)&(sys.u);
答案 1 :(得分:0)
你可能想要的不是char而是unsigned char。 有符号字符中的第一位表示符号,因此实际值只剩下7位。这导致将0xff解释为十进制-1,其被打印为十六进制0xffffffff。 使用unsigned char一切都很好。