【问题标题】:Char seems to be an int no matter what I do, not sure what is happening无论我做什么,Char 似乎都是一个 int,不确定发生了什么
【发布时间】:2020-05-09 06:27:41
【问题描述】:

这是我的代码,我正在尝试使用结构创建位字段并首先将它们排序为 lsB:

struct rhmp{
    unsigned int type1:4;
    unsigned int dstPort:14;
    unsigned int srcPort:14;
};

struct rhmp rhmp1;

rhmp1.type1 = 3;
rhmp1.dstPort = 122;
rhmp1.srcPort = 300;

char firstByte = (((char)rhmp1.type1 & 0xF) << 4) + (((char)rhmp1.dstPort & 0x3C00)>>10);
char secondByte = (rhmp1.dstPort & 0x3FC) >> 2;
char thirdByte = ((rhmp1.dstPort & 0x3) << 6) + ((rhmp1.srcPort & 0x3F00)>>8);
//char thirdByte = 0x81;
char fourthByte = (rhmp1.srcPort & 0xFF);

char messageToSend[4] = {firstByte, secondByte, thirdByte, fourthByte};

printf("RHMP byte 1: %X\n",firstByte);
printf("RHMP byte 2: %X\n",(int)secondByte);
printf("RHMP byte 3: %X\n",(int)thirdByte);
printf("RHMP byte 3 should be: %X\n",(int) ((rhmp1.dstPort & 0x3) << 6) + ((rhmp1.srcPort & 0x3F00)>>8));
printf("RHMP byte 4: %X\n",(int)fourthByte);`

这是打印出以下内容:

RHMP byte 1: 30
RHMP byte 2: 1E
RHMP byte 3: FFFFFF81
RHMP byte 3 should be: 81
RHMP byte 4: 2C

无论我做什么,字节 3 似乎都是一个 32 位的值。即使我将它分配给 0x81 它也不起作用。这里发生了什么?

【问题讨论】:

  • 0x81 存储在char 中时为负数。尝试将字节 3 声明为 unsigned char
  • 谢谢,成功了。仍然不确定为什么变成 32 位,但 FFFFF 现在有意义了。
  • 所有char变量默认为signed char。将其类型转换为 unsigned char 而不是 int。 0x81 被认为是负数,因此会打印前导数。
  • Re "所有char变量默认都是signed char",这实际上是由各个编译器决定的。
  • @user3386109:char 是有符号还是无符号取决于 C 实现。

标签: c struct char int


【解决方案1】:

不合格的char 是您系统上的签名类型(因实现而异),不合格的int 始终指代signed int

thirdByte 的值为 -127。当您将其转换为 signed int 时,它会生成具有相同值 (-127) 的 signed int

您可以使用unsigned char 而不是char 来解决您的问题。

【讨论】:

  • 技术说明:即使char在一个实现中被签名,它仍然是和signed char不同的类型; char 从不指代signed char。 (相比之下,intsigned int 的类型相同。)
  • @Eric Postpischil,谢谢。调整
猜你喜欢
  • 2022-01-14
  • 2015-10-29
  • 2012-09-12
  • 2021-05-30
  • 2011-03-17
  • 2017-09-11
  • 1970-01-01
  • 2013-05-31
  • 2016-09-22
相关资源
最近更新 更多