uint64_t 类型的问题

Issue with uint64_t type

说我有以下 union :

    typedef union
{
    char array[8];
    uint64_t u64;
} my_type ;

我想在保留的所有 64 位中移动一位 1,这是我试过的方法:

   ...........................
    my_type  vector  ={0};
    short index =0; 
    for ( index=0 ; index <64;index++){
            printf("  u64 :   %d\n", vektor.u64);
            vektor.u64 = (1<<index) ;
        }

输出很好告诉 15th,这不是 printf 参数的问题,值肯定是错误的 = 0。这是输出:

     u64 :   0
  u64 :   1
  u64 :   2
  u64 :   4
  u64 :   8
  u64 :   16
  u64 :   32
  u64 :   64
  u64 :   128
  u64 :   256
  u64 :   512
  u64 :   1024
  u64 :   2048
  u64 :   4096
  u64 :   8192
  u64 :   16384
  u64 :   -32768
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0
  u64 :   0

所以我的问题是,我做错了什么?顺便说一下,我使用的是 ATmelStudio6.2。

我相信,您遇到了所用格式说明符的问题。 %d 期望 intvektor.u64 不是。

要安全地打印 uint64_t 类型,您应该使用 PRIu64 作为格式说明符。它在 inttypes.h 头文件中可用。

你可以改变

 printf("  u64 :   %d\n", vektor.u64);

 printf("  u64 :"   PRIu64 "\n", vektor.u64);

编辑:

正如 @Joachim Pileborg 先生在 中提到的那样,您需要更改 整数文字 11ULL 以确保将其解释为 unsigned long long

除了 Sourav 指出的格式之外的另一个问题是值 1 是一个 int,并且 int 不太可能是 64 位(事实上,它似乎对我来说,在你的平台上 int 只有 16 位)。

您需要使用例如1ULL 得到一个可以移动 64 位的 unsigned long long

下面是您的代码的略微修改版本。

去除杂乱的简化。

但是,它确实显示了执行所需操作的正确方法。

#include <stdio.h>

int main( void )
{
    unsigned long long u64Bits;
    short index =0;

    for ( index=0 ; index <64;index++)
    {
            printf("  u64 :   %llu\n", u64Bits );
            u64Bits = ((unsigned long long)1<<index) ;
    }
    return(0);
}

以上代码的输出如下:

 u64 :   0
  u64 :   1
  u64 :   2
  u64 :   4
  u64 :   8
  u64 :   16
  u64 :   32
  u64 :   64
  u64 :   128
  u64 :   256
  u64 :   512
  u64 :   1024
  u64 :   2048
  u64 :   4096
  u64 :   8192
  u64 :   16384
  u64 :   32768
  u64 :   65536
  u64 :   131072
  u64 :   262144
  u64 :   524288
  u64 :   1048576
  u64 :   2097152
  u64 :   4194304
  u64 :   8388608
  u64 :   16777216
  u64 :   33554432
  u64 :   67108864
  u64 :   134217728
  u64 :   268435456
  u64 :   536870912
  u64 :   1073741824
  u64 :   2147483648
  u64 :   4294967296
  u64 :   8589934592
  u64 :   17179869184
  u64 :   34359738368
  u64 :   68719476736
  u64 :   137438953472
  u64 :   274877906944
  u64 :   549755813888
  u64 :   1099511627776
  u64 :   2199023255552
  u64 :   4398046511104
  u64 :   8796093022208
  u64 :   17592186044416
  u64 :   35184372088832
  u64 :   70368744177664
  u64 :   140737488355328
  u64 :   281474976710656
  u64 :   562949953421312
  u64 :   1125899906842624
  u64 :   2251799813685248
  u64 :   4503599627370496
  u64 :   9007199254740992
  u64 :   18014398509481984
  u64 :   36028797018963968
  u64 :   72057594037927936
  u64 :   144115188075855872
  u64 :   288230376151711744
  u64 :   576460752303423488
  u64 :   1152921504606846976
  u64 :   2305843009213693952
  u64 :   4611686018427387904