簡體   English   中英

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。

另一個問題除了格式化所指出的Sourav,是值1int ,這是不可能的, int是64位(其實,在我看來,關於你的平台int只有16位)。

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

我相信,您在使用格式說明符時遇到了問題。 %d期望一個不vektor.u64int

為了安全地打印uint64_t類型,您應該使用PRIu64作為格式說明符。 inttypes.h頭文件中可用。

你可以改變

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

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

編輯:

正如@Joachim Pileborg先生在另一個答案中提到的那樣 ,您需要將整數文字 1更改為1ULL ,以確保將其解釋為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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM