美好的一天!我已经找到了解决问题的方法,但是我找不到任何问题......至少所有提议的解决方案对我都不起作用......或者我做错了......
我有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
这里有什么问题?
拜托,帮助我......我不是大学生,我没有任何顾问帮助过我......
答案 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;
}