uint64_t类型

时间:2015-06-03 07:22:36

标签: c bitwise-operators avr bit-shift unsigned-integer

说我有以下union

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

我想将一位1移位到保留的所有64位,这是我尝试过的:

   ...........................
    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。

3 个答案:

答案 0 :(得分:2)

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

您需要使用例如1ULL获得可以移位64位的unsigned long long

答案 1 :(得分:1)

我相信,您将面临使用格式说明符的问题。 %d需要int vektor.u64不是。

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

您可以更改

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

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

编辑:

@Joachim Pileborg other answer中提到的那样,您需要将整数字面 1更改为1ULL确保将其解释为unsigned long long

答案 2 :(得分:1)

下面的

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

简化了删除杂乱的内容。

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

#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