C 整数上的移位运算符

C 整数上的移位运算符,c,C,我有以下功能: #include<stdio.h> #include <stdlib.h> #include <math.h> #include <stdint.h> #include <inttypes.h> uint64_t dtally(uint64_t x) { uint64_t t = 0; while (x){ t += 1 << ((x%10) * 6), x /= 10; retu

我有以下功能:

 #include<stdio.h>
#include <stdlib.h>
#include <math.h>
#include <stdint.h>
#include <inttypes.h>

uint64_t dtally(uint64_t x)
{
    uint64_t t = 0;
    while (x){ t += 1 << ((x%10) * 6), x /= 10;
    return t;
}

int main(int argc, char *argv[])
{
    printf("%" PRIu64 "\n", dtally(39));
    return 0;
}
但它返回这个值:

4456448
因为返回此值而不是您期望的值?

18014398509481984对于您的平台上的int来说可能太大了

通过测试sizeofint来检查这一点。如果是4,那么你能代表的最大数字是20多亿。它甚至可能只有2,在这种情况下,最大的整数是32767

您可以使用int64_t,它是64位的,从C99开始就可用;虽然平台不一定要支持它


不要忘记在任何文本后面加上表示64位类型的LL。

代码有两个问题,实际上是同一个问题出现了两次

首先,t是一个int,通常是一个32位整数,至少16位。因此,2^54将不适用于此。您必须为t使用64位类型。但你的问题会持续下去


第二个问题更为棘手:1 int类型通常只有32位,即使在64位系统上也是如此。使用例如int64\t。请不要以显著改变问题含义的方式编辑问题。但使用uint64\t也会得到与我编辑上述代码相同的结果
4456448
int count(int x)
{
    int64_t t = 0;
    while (x) t += 1LL << ((x % 10) * 6), x /= 10;
    return t;
}