1

众所周知,每个可打印字符都有其 ascii 值。我正在尝试将 8 个字符的 ascii 值转换为 64 位整数,但它只复制 32 位。

char * ch = "AAAABBBB";
unsigned long int i;

//copy charater's ascii to 64 bits int
memcpy(&i, ch, 8);
printf("integer hold: 0x%x\n", i); 

这段代码有问题吗?

我期望的输出是:

integer hold: 0x4141414142424242

但输出是:

integer hold: 0x41414141
4

3 回答 3

2

如果unsigned long确实是 64 位类型(你可以输出sizeof(unsigned long)来检查一下),你仍然需要使用%lx格式字符串来打印它。

如果unsigned long是 32 位,您可能不得不求助于unsigned long long并使用%llx格式字符串。

来自C11 7.20.6.1 The fprintf function

o,u,x,X unsigned int 参数转换为 dddd 样式的无符号八进制 (o)、无符号十进制 (u) 或无符号十六进制表示法(x 或 X);字母 abcdef 用于 x 转换,字母 ABCDEF 用于 X 转换。精度指定出现的最小位数;如果要转换的值可以用更少的数字表示,则用前导零扩展它。默认精度为 1。精度为零的零值转换的结果是没有字符。

l (ell):指定后面的 d、i、o、u、x 或 X 转换说明符适用于 long int 或 unsigned long int 参数。

ll (ell-ell):指定后面的 d、i、o、u、x 或 X 转换说明符适用于 long long int 或 unsigned long long int 参数。

于 2013-02-05T04:19:58.037 回答
-1

longlong long.

在 VC++ 中,long数据类型仍然只有 32 位。

当然,在大多数平台上使用的printf格式是 32 位。您想要(或者可能如果您已经是 64 位)。%xint%llx%lxlong

于 2013-02-05T04:19:10.673 回答
-1

%x 用于打印无符号整数值和它的 32 位,这就是你得到这样的结果的原因。

%d %i     Decimal signed integer.
%o        Octal integer.
%x %X     Hex integer.
%u        Unsigned integer.
%c        Character.
%s        String.
%f        double
%e %E     double.
%g %G     double.
%p        pointer.

&如果您想打印剩余数据,请尝试...

int *p;
p=(char *)(&i)+4;

printf("integer hold: 0x%x\n", i);
printf("integer hold: 0x%x\n",*p);
于 2013-02-05T04:31:23.147 回答