说我有以下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。
答案 0 :(得分:2)
除了Sourav指出的格式之外的另一个问题是值1
是int
,并且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