【问题标题】:How to use high and low bytes?如何使用高字节和低字节?
【发布时间】:2011-08-30 17:44:29
【问题描述】:

我试图用 2 个字节来表示 32768。对于高字节,我是否使用与低字节相同的值,它会以不同的方式解释它们,还是我输入实际值?所以我会放一些像 32678 0 还是 256 0?或者那些都不是?任何帮助表示赞赏。

【问题讨论】:

  • 你想做什么?在 c++ 中,无符号的 short 是 16 位的,最多可存储 32767 个数字。
  • 家庭作业,嗯? :) 看这里:en.wikipedia.org/wiki/Binary_numeral_system 字节不过是八位组。
  • 我正在尝试发送 iRobot 创建命令以直线行驶。它说“32768 或 32767”的值将使它直行。它接收一个高字节和一个低字节。我得到的最好成绩(就直行而言)是 255 128,但还是有一些。
  • @Mike Bantegui 一个有符号的空头存储号码最多为 32767,一个未签名的空头号码最多为 65535。

标签: c++ byte bytearray bit 16-bit


【解决方案1】:

在十六进制中,您的数字是 0x8000,即 0x80 和 0x00。 要从输入中获取低字节,请使用low=input & 0xff,要获取高字节,请使用high=(input>>8) & 0xff

从低字节和高字节返回输入,如下所示:input=low | (high<<8)

确保您使用的整数类型足够大以存储这些数字。在 16 位系统上,unsigned int/shortsigned/unsigned long 应该足够大。

【讨论】:

  • unsigned short。通常最好将 unsigned 类型与 >> 运算符一起使用。
  • 仅因为涉及两个字节,所以明智的做法是假设 16 位边界不会被破坏。不过,一般来说,位移运算符只适用于 signed 整数,而选择无符号应该更多地与是否需要负值有关。
  • short 足够大,以至于 32768 可能会溢出到 -32768,并且int 可能与 short 的大小相同。因此32768 >> 8 的值是实现定义的。
  • 其实这个对话是无关紧要的。我刚刚注意到这个问题被标记为 16 位。相应地更新我的答案...
【解决方案2】:

字节只能包含 0 到 255 之间的值,包括 0 到 255。 32768为0x8000,所以高字节为128,低字节为0。

【讨论】:

  • 您享有很高的声誉,但字节总是正好是 8 位宽仍然不是真的。顺便说一句,这也是为什么在协议规范中经常使用名称“八位字节”而不是“字节”的原因。仍然存在一些系统,其中一个字节的大小可以大于 8 位。另见维基百科:en.wikipedia.org/wiki/Byte
  • 很公平。但我想我一方面可以计算出将字节定义为 8 位以外的现代系统的数量。
  • 真真。我认为在实践中这通常无关紧要,但我认为人们应该知道其中的区别。而且由于 OP 的问题是一个非常基本的问题,我认为在答案中值得一提。
  • 总是和斑马在一起。马人,马。
【解决方案3】:

试试这个功能。 将您的 Hi_Byte 和 Lo_Byte 传递给函数,它以 Word 形式返回值。

WORD MAKE_WORD( const BYTE Byte_hi, const BYTE Byte_lo)
{
     return   (( Byte_hi << 8  ) | Byte_lo & 0x00FF );
}

【讨论】:

    【解决方案4】:

    指针可以轻松做到这一点,比移位快得多,并且不需要处理器数学运算。

    Check this answer

    但是: 如果我理解您的问题,您最多需要 32768 存储在 2 个字节中,因此您需要 2 个无符号整数或 1 个无符号长整数。 只需将 int 更改为 long 并将 char 更改为 int 即可。

    【讨论】:

      【解决方案5】:

      32768 是 0x8000,因此您可以将 0x80 (128) 放在高字节中,将 0 放在低字节中。

      当然,这是假设无符号值。 32768 实际上不是带符号的 16 位值的合法值。

      【讨论】:

        【解决方案6】:

        十六进制的 32768 在 little-endian 平台上是 0080。 “高”(在我们的例子中是第二个)字节包含 128,“低”字节包含 0。

        【讨论】:

        • 这无益且令人困惑。它引入了字节的第二个属性,即内存中的相对顺序,并且未能解释它以及 OP 提到的高阶/低阶属性。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-13
        • 1970-01-01
        • 1970-01-01
        • 2021-01-22
        • 2017-05-01
        相关资源
        最近更新 更多