【问题标题】:C bytes - can't output char (only 8 bits)C 字节 - 不能输出字符(只有 8 位)
【发布时间】:2012-10-13 01:57:40
【问题描述】:

请看一下我的函数:

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;
}

在评论之前一切都很好。也就是说,我从一个整数x 开始,我只想取某个小节(由n 指定)。所以我所做的就是把除了我想保持为零的 8 位之外的所有东西都做完。例如,如果输入是:

 1001011 10011011 00101011 01001011

我只想保留第 3 组位(从右数),那么结果将是:

 00000000 10011011 00000000 00000000 

所以我成功地做到了这一点。问题是,我需要返回我想要的位(裁剪零,作为char)。尽管创建了 char result 并返回它,但返回的仍然是 32 位值。

有什么帮助吗?谢谢!

明确一点:对于00000000 10011011 00000000 00000000,我希望返回10011011

谢谢!

【问题讨论】:

    标签: c int byte bit


    【解决方案1】:

    是的,它不是一个 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;
    }
    

    【讨论】:

    • 谢谢,这是一个粗心的错字,但在实际程序中,我让它返回结果作为您的编辑......仍然不是我正在寻找的字符。但看起来它返回负数......
    • 是的,好像char 的最高有效位是一,那么结果是负数。然后将返回类型和/或结果类型更改为usigned char
    • “看起来它返回负数” - 然后将函数转换为“unsigned char”。顺便说一句,该函数应该对参数 n 的值执行范围检查。而且由于返回的是一个完整的字节,所以位掩码是多余的,即result = x &gt;&gt; (n &lt;&lt; 3)
    【解决方案2】:

    基本问题是您尝试使用有符号整数来执行此操作,但没有明确定义有符号整数的移位 - 每当位模式恰好是负值时,就会发生坏事。

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

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 2015-09-01
      • 2016-10-18
      • 1970-01-01
      • 1970-01-01
      • 2016-02-29
      • 2011-06-17
      • 1970-01-01
      • 1970-01-01
      • 2018-06-09
      相关资源
      最近更新 更多