[英]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,是值1
是int
,這是不可能的, int
是64位(其實,在我看來,關於你的平台int
只有16位)。
您需要使用例如1ULL
來獲得可以移位64位的unsigned long long
。
我相信,您在使用格式說明符時遇到了問題。 %d
期望一個不vektor.u64
的int
。
為了安全地打印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.