指向联合存储的字符指针

时间:2014-07-17 13:39:27

标签: c hex byte

我试图在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。 纠正我如果我错了。

2 个答案:

答案 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一切都很好。