众所周知,每个可打印字符都有其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
答案 0 :(得分: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参数。
答案 1 :(得分:-1)
long
与long long
。
在VC ++中,long
数据类型仍然只有32位。
当然,printf
格式%x
用于int
,在大多数平台上为32位。如果您的%llx
已经是64位,则需要%lx
(或可能long
。
答案 2 :(得分:-1)
%x用于打印unsigned int值&它的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);