C++ 隐式转换还是强制转换?
我有一个函数,它将32位字的位进行交织,并返回一个64位的结果。对于这个简单的测试用例,底部的3个字节是正确的,而顶部的5个字节的内容是不正确的。intToBin_32和intToBin_64是方便的函数,用于查看参数的二进制表示形式并返回val。我将从32位类型到64位类型的强制转换放在了我认为需要的任何位置,但我仍然看到了这种意想不到的(至少对我来说)行为。这里是否正在进行隐式转换,或者是否有其他原因导致无法正常工作C++ 隐式转换还是强制转换?,c++,C++,我有一个函数,它将32位字的位进行交织,并返回一个64位的结果。对于这个简单的测试用例,底部的3个字节是正确的,而顶部的5个字节的内容是不正确的。intToBin_32和intToBin_64是方便的函数,用于查看参数的二进制表示形式并返回val。我将从32位类型到64位类型的强制转换放在了我认为需要的任何位置,但我仍然看到了这种意想不到的(至少对我来说)行为。这里是否正在进行隐式转换,或者是否有其他原因导致无法正常工作 #include <stdint.h> #include &l
#include <stdint.h>
#include <stdio.h>
struct intString_32 {char bstr [32 + 1 + 8];};
struct intString_64 { char bstr [64 + 1 + 8];};
intString_32 intToBin_32(int a)
{
intString_32 b;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 5; j++)
{
if (j != 4)
{
b.bstr[5*i + j] = * ((a & (1 << (31 - (4*i + j)))) ? "1" : "0");
}
else
{
b.bstr[5*i + j] = 0x20;
}
}
}
b.bstr[40] = * ( "\0" );
return b;
}
intString_64 intToBin_64(long long a)
{
intString_64 b;
for (int i = 0; i < 8; i++)
{
for (int j = 0; j < 9; j++)
{
if (j != 8)
{
b.bstr[9*i + j] = * ((a & (1 << (63 - (8*i + j)))) ? "1" : "0");
}
else
{
b.bstr[9*i + j] = 0x20;
}
}
}
b.bstr[72] = * ( "\0" );
return b;
}
uint64_t interleaveBits(unsigned int a, unsigned int b)
{
uint64_t retVal = 0;
for (unsigned int i = 0; i < 32; i++)
{
retVal |= (uint64_t)((uint64_t)((a >> i) & 0x1)) << (2*i);
retVal |= (uint64_t)((uint64_t)((b >> i) & 0x1)) << (2*i + 1);
}
return retVal;
}
int main(int arc, char* argv)
{
unsigned int foo = 0x0004EDC7;
unsigned int bar = 0x5A5A00FF;
uint64_t bat = interleaveBits(foo, bar);
printf("foo: %s \n", intToBin_32(foo).bstr);
printf("bar: %s \n", intToBin_32(bar).bstr);
printf("bat: %s \n\n", intToBin_64(bat).bstr);
}
#包括
#包括
struct intString_32{char bstr[32+1+8];};
结构intString_64{char bstr[64+1+8];};
intString_32 intToBin_32(int a)
{
intString_32 b;
对于(int i=0;i<8;i++)
{
对于(int j=0;j<5;j++)
{
如果(j!=4)
{
b、 bstr[5*i+j]=*((a&(1i)和0x1))通过调试,我注意到这一行中的intToBin_64
是错误的:
b.bstr[9*i + j] = * ((a & (1 << (63 - (8*i + j)))) ? "1" : "0");
该死,被打败了一分钟。这是正确的答案。下层选民愿意分享原因吗?
(1 << (63 - (8*i + j)))
b.bstr[9*i + j] = * ((a & (1ll << (63 - (8*i + j)))) ? "1" : "0");