C++ 隐式转换还是强制转换?

C++ 隐式转换还是强制转换?,c++,C++,我有一个函数,它将32位字的位进行交织,并返回一个64位的结果。对于这个简单的测试用例,底部的3个字节是正确的,而顶部的5个字节的内容是不正确的。intToBin_32和intToBin_64是方便的函数,用于查看参数的二进制表示形式并返回val。我将从32位类型到64位类型的强制转换放在了我认为需要的任何位置,但我仍然看到了这种意想不到的(至少对我来说)行为。这里是否正在进行隐式转换,或者是否有其他原因导致无法正常工作 #include <stdint.h> #include &l

我有一个函数,它将32位字的位进行交织,并返回一个64位的结果。对于这个简单的测试用例,底部的3个字节是正确的,而顶部的5个字节的内容是不正确的。intToBin_32和intToBin_64是方便的函数,用于查看参数的二进制表示形式并返回val。我将从32位类型到64位类型的强制转换放在了我认为需要的任何位置,但我仍然看到了这种意想不到的(至少对我来说)行为。这里是否正在进行隐式转换,或者是否有其他原因导致无法正常工作

#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");