如果我有两个变量:
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?
答案 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;
以上是简单的步骤,许多步骤可以合并。