C字节 - 不能输出char(只有8位)

时间:2012-10-13 01:57:41

标签: c int byte bit

请看一下我的功能:

int getByte(int x, int n) {
   int oneOnes = 255 << ( n << 3);
   int compute = oneOnes & x;
   //FIND A WAY TO RETURN CHAR (NOT INT)
   char result = (compute >> (n << 3));
   return result;
}

在评论之前,Everthing很有效。也就是说,我从整数x开始,我只想采用某个子部分(由n指定)。所以我所做的就是将除了8位之外的所有内容都保留为零。例如,如果输入是:

 1001011 10011011 00101011 01001011

我想只保留第3组比特(从右边算起),结果将是:

 00000000 10011011 00000000 00000000 

所以我设法正确地做到了。问题是,我需要只返回 我想要的位(将零裁剪为char)。尽管创建了char result并返回了它,但返回的内容仍然是32位值。

有任何帮助吗?谢谢!

要明确:对于00000000 10011011 00000000 00000000,我只想要 10011011

谢谢!

2 个答案:

答案 0 :(得分:2)

是的,它不是一个8位的值,因为你的函数被声明为返回int而不是char而你返回的不是结果而是计算。此外,如果您希望不在某处使用unsigned char作为结果类型进行符号传播:

unsigned char getByte(int x, int n) {
  int oneOnes = 255 << ( n << 3);
  int compute = oneOnes & x;
  //FIND A WAY TO RETURN CHAR (NOT INT)
  unsigned char result = (compute >> (n << 3));
  return result;
}

但是这个实现效率更高:

unsigned getByte(int x, int n) {
   return (x >> (n << 3)) & 0xFF;
}

答案 1 :(得分:1)

基本问题是你试图使用有符号整数来做这个,但是有符号整数的移位没有明确定义 - 只要位模式恰好是负值,就会发生坏事。

相反,通常在进行位操作时,您需要使用无符号整数:

unsigned int getByte(unsigned int x, unsigned int n) {
  unsigned int oneOnes = 255U << ( n << 3);
  unsigned int compute = oneOnes & x;
  return (compute >> (n << 3));
}

如果您在移位后进行遮罩,则更容易,因为您不需要移动遮罩:

unsigned int getByte(unsigned int x, unsigned int n) {
  return (x >> (n << 3)) & 255U;
}