【问题标题】:Converting binary stored in 2 unsigned character to integer将存储在 2 个无符号字符中的二进制转换为整数
【发布时间】:2015-04-14 16:09:06
【问题描述】:

如果我有两个变量:

unsigned char var1, var2;
var1 = 4A; // for simplicity I am showing the hex value 4A, but it is 1 
            // byte of binary representing the value 4A - 0100 1010
var2 = 3F;

我想从函数返回整数结果:3F4A

在 C 语言中我可以简单地做到这一点吗?

int result;
var2 << 8;   // left shift var2 by 8 bits
result = var1 + var2;
return result;

我可以以这种方式简单地将存储在 char 变量中的二进制“转换”为 int 吗?即结果会返回整数16202吗?

【问题讨论】:

  • 16202 = 0x3F4A 无论如何,你想准确投射什么?
  • @Anton.P 假设我有 4A 存储在 var1 中,3F 存储在 var2 中,我想返回 0x3F4A 的整数值
  • unsigned int 结果=(((unsigned int)var2

标签: c binary char


【解决方案1】:

虽然在大多数平台上可以使用有符号算术,但为了在形式上正确,您应该使用 unsigned 类型来计算位模式。

现在,首先

var2 << 8;

不左移var2:它只是一个计算结果的表达式,被丢弃了。

该结果是有符号类型int,因为int 是操作数中最常见的类型。

您需要unsigned 计算,因此请确保至少有一个操作数是无符号类型,即

return static_cast<int>( var1 + (var2 << 8u) );

要完全是位级的,请将+ 替换为位级或|。但这在逻辑上并不重要,而且很可能会生成相同的机器代码。

【讨论】:

  • 在我的代码中,我确实将它作为 var2 = var2 &lt;&lt; 8; 我的 char 变量是无符号的,这不是你所指的吗?
  • @user3501476:您的unsigned char 变量没有问题。关于你的代码,我不是心灵感应,我不可能看到那个代码。
【解决方案2】:

您可以尝试像这样使用一些讨厌的位级黑客:

result = (int) ( ((int)var2) << 8 | var1 )

我不确定移位是否会溢出 var2,所以先将其转换为 int,将其向左移动 8 位,然后与 var1 进行二进制 OR。

【讨论】:

  • 内部演员表不起作用。但它的意图(无论如何都是一样的)是使用形式上不合适的结果类型。
【解决方案3】:

这一行:'var2

(应该被编译器捕获,。

另一个总是在启用所有警告的情况下编译的好理由)

因为 var2 只有 8 位宽。

建议使用第三个变量来保存结果:

int var3;  
var3 = (int)var2;  
var3 <<=8;  
var3 |= (int)var1;

以上步骤很简单,很多步骤可以组合起来。

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 1970-01-01
    • 2020-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-12
    • 1970-01-01
    相关资源
    最近更新 更多