将存储在2个无符号字符中的二进制转换为整数

时间:2015-04-14 16:09:07

标签: c binary char

如果我有两个变量:

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;

我可以简单地&#34;演员&#34;二进制存储在char变量中以这种方式转换为int?即结果将返回整数16202?

3 个答案:

答案 0 :(得分:1)

虽然在大多数平台上它都可以使用带符号的算术,但要正确地说是正确的,你应该使用 unsigned 类型来计算位模式。

现在,首先

var2 << 8;

没有离开var2:它只是一个计算结果的表达式,被丢弃了。

该结果具有签名类型int,因为int是操作数的最高常见类型。

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

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

完全是bit-level-ish,用位级OR替换+|。但逻辑上并不重要,并且很可能生成相同的机器代码。

答案 1 :(得分:0)

您可以尝试使用这样讨厌的位级别黑客攻击:

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

我不确定bitshift是否会溢出var2,所以首先将它转换为int,将其向左移动8位,然后使用var1预先形成二进制OR。

答案 2 :(得分:0)

这一行:'var2&lt;&lt; 8; '会失败

(应该被编译器捕获,

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

因为var2只有8位宽。

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

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

以上是简单的步骤,许多步骤可以合并。

相关问题