将存储在 2 个无符号字符中的二进制转换为整数
Converting binary stored in 2 unsigned character to integer
如果我有两个变量:
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;
我想 return 从函数给出的整数结果:3F4A
在 C 中我可以简单地这样做吗?
int result;
var2 << 8; // left shift var2 by 8 bits
result = var1 + var2;
return result;
我可以通过这种方式简单地将存储在char变量中的二进制"cast"转换为int吗?即会导致 return 整数 16202?
您可以尝试像这样使用一些讨厌的位级别黑客攻击:
result = (int) ( ((int)var2) << 8 | var1 )
我不确定bitshift是否会溢出var2,所以先将其转换为int,将其向左移动8位,然后与var1进行二进制OR。
虽然在大多数平台上它都可以使用带符号的算法,但为了在形式上迂腐地正确,您应该使用 unsigned 类型来计算位模式。
现在,首先
var2 << 8;
不左移var2
: 只是一个计算结果的表达式,被丢弃了。
结果是有符号类型 int
,因为 int
是操作数的最高通用类型。
你想要一个unsigned
计算,所以确保至少一个操作数是无符号类型,即
return static_cast<int>( var1 + (var2 << 8u) );
要完全是位级的,请将 +
替换为位级或 |
。但是逻辑上没有关系,很可能生成相同的机器码。
此行:'var2 << 8; ' 将失败
(应该会被编译器捕获,.
始终在启用所有警告的情况下进行编译的另一个好理由)
因为 var2 只有 8 位宽。
建议使用第三个变量来保存结果:
int var3;
var3 = (int)var2;
var3 <<=8;
var3 |= (int)var1;
以上是简单的步骤,许多步骤可以组合。
如果我有两个变量:
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;
我想 return 从函数给出的整数结果:3F4A
在 C 中我可以简单地这样做吗?
int result;
var2 << 8; // left shift var2 by 8 bits
result = var1 + var2;
return result;
我可以通过这种方式简单地将存储在char变量中的二进制"cast"转换为int吗?即会导致 return 整数 16202?
您可以尝试像这样使用一些讨厌的位级别黑客攻击:
result = (int) ( ((int)var2) << 8 | var1 )
我不确定bitshift是否会溢出var2,所以先将其转换为int,将其向左移动8位,然后与var1进行二进制OR。
虽然在大多数平台上它都可以使用带符号的算法,但为了在形式上迂腐地正确,您应该使用 unsigned 类型来计算位模式。
现在,首先
var2 << 8;
不左移var2
: 只是一个计算结果的表达式,被丢弃了。
结果是有符号类型 int
,因为 int
是操作数的最高通用类型。
你想要一个unsigned
计算,所以确保至少一个操作数是无符号类型,即
return static_cast<int>( var1 + (var2 << 8u) );
要完全是位级的,请将 +
替换为位级或 |
。但是逻辑上没有关系,很可能生成相同的机器码。
此行:'var2 << 8; ' 将失败
(应该会被编译器捕获,.
始终在启用所有警告的情况下进行编译的另一个好理由)
因为 var2 只有 8 位宽。
建议使用第三个变量来保存结果:
int var3;
var3 = (int)var2;
var3 <<=8;
var3 |= (int)var1;
以上是简单的步骤,许多步骤可以组合。