如何将64位整数分成2个32位整数?

时间:2016-08-02 10:51:52

标签: c++11

美好的一天!我已经找到了解决问题的方法,但是我找不到任何问题......至少所有提议的解决方案对我都不起作用......或者我做错了......

我有64位整数:

{uint64_t st0 = 1470134824450120;}

我想只得到这个数字的最后8位数字,即24450120

我为此做了以下事情:

uint32_t timestamp1 = 0;
uint32_t timestamp2 = 0;

timestamp2 = (uint32_t) st0;
timestamp1 = st0 >> 32;

printf("input:    %" PRIu64 "\n", st0);
printf("unpacked: %" PRIu32 " %" PRIu32 "\n", timestamp2, timestamp1);

结果我得到了:

input:    1470134824450120
unpacked: 1878767688 342292

这里有什么问题?

拜托,帮助我......我不是大学生,我没有任何顾问帮助过我......

3 个答案:

答案 0 :(得分:3)

所以你有这个号码:1470134824450120。

它在二进制文件中的重复是:

00000000000001010011100100010100 01101111111110111011100001001000

计算完成后,您在变量 timestamp2 1101111111111111011100001001000位中的位数为1878767688(十进制)和 timestamp1 00000000000001010011100100010100(小数点为342292)。

所以价值是正确的。

如果您想获得最后8位数:st0%100000000

答案 1 :(得分:0)

你的帖子标题要求你在问题中提出的其他内容。 如果要分割/剪切特定数量的十进制数字,则无法通过操作完成,就像您想要二进制数字一样。

如果你真的想得到最后8位小数,我建议你将这个64位整数作为字符串放入缓冲区(例如sprintf),然后从这个缓冲区中删除最后8位数,然后从中取出一个整数它(例如atol)。

答案 2 :(得分:0)

我没有尝试编译,但你可以试试这个:)

#pragma pack(push)  /* push current alignment to stack */
#pragma pack(1)     /* set alignment to 1 byte boundary */
typedef union {
    struct {
        uint32_t a;
        uint32_t b;
    } decoupled;
    uint64_t value;
} MyUnsignedDecoupledInt64;
#pragma pack(pop)   /* restore original alignment from stack */

MyUnsignedDecoupledInt64 getDecoupledUnsignedInt64(uint64_t value)
{
    MyUnsignedDecoupledInt64 ret;
    ret.value = value;
    return ret;
}

int main() {

    MyUnsignedDecoupledInt64 t = getDecoupledUnsignedInt64(1000000000LL);
    printf("%u %u\n", t.decoupled.a, t.decoupled.b);

    return 0;
}
相关问题