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
期望 int
而 vektor.u64
不是。
要安全地打印 uint64_t
类型,您应该使用 PRIu64
作为格式说明符。它在 inttypes.h
头文件中可用。
你可以改变
printf(" u64 : %d\n", vektor.u64);
到
printf(" u64 :" PRIu64 "\n", vektor.u64);
编辑:
正如 @Joachim Pileborg 先生在 中提到的那样,您需要更改 整数文字 1
到 1ULL
以确保将其解释为 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
说我有以下 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
期望 int
而 vektor.u64
不是。
要安全地打印 uint64_t
类型,您应该使用 PRIu64
作为格式说明符。它在 inttypes.h
头文件中可用。
你可以改变
printf(" u64 : %d\n", vektor.u64);
到
printf(" u64 :" PRIu64 "\n", vektor.u64);
编辑:
正如 @Joachim Pileborg 先生在 1
到 1ULL
以确保将其解释为 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