当前位置: 技术问答>linux和unix
求救:关于long long 的问题!
来源: 互联网 发布时间:2015-05-05
本文导语: 各位高手:小弟写了一段很小的程序测试用,代码如下: #include #include main() { unsigned long long mask; unsigned long long val; char c[4]; mask = 255; val = 3; printf("Output use lld : val = %lld,mask = %lldn",val,mas...
各位高手:小弟写了一段很小的程序测试用,代码如下:
#include
#include
main()
{
unsigned long long mask;
unsigned long long val;
char c[4];
mask = 255;
val = 3;
printf("Output use lld : val = %lld,mask = %lldn",val,mask);
printf("Output use 2x : val = %2x,mask = %2xn",val,mask);
printf("Output use 2x : mask = %2x,val = %2xn",mask,val);
printf("mask = %2xn",mask);
printf("val = %2xn",val);
printf("%2xn",(mask & val));
memset(c,0,4);
sprintf(c,"%2x",(mask & val));
printf("%sn",c);
}
x86平台下,gcc编译运行,结果如下:
Output use lld : val = 3,mask = 255
Output use 2x : val = 3,mask = 0
Output use 2x : mask = ff,val = 0
mask = ff
val = 3
3
3
PowerPC平台下,gcc编译运行,结果如下:
Output use lld : val = 3,mask = 255
Output use 2x : val = 30013000,mask = 0
Output use 2x : mask = 30013000,val = 0
mask = 30013000
val = 30013000
30013000
0
均不能完全正确。
不知什么原因,但是如果使用long或者int代替long long 定义,就没有问题。
各位高手指教一二啊!
小弟谢了,先!
#include
#include
main()
{
unsigned long long mask;
unsigned long long val;
char c[4];
mask = 255;
val = 3;
printf("Output use lld : val = %lld,mask = %lldn",val,mask);
printf("Output use 2x : val = %2x,mask = %2xn",val,mask);
printf("Output use 2x : mask = %2x,val = %2xn",mask,val);
printf("mask = %2xn",mask);
printf("val = %2xn",val);
printf("%2xn",(mask & val));
memset(c,0,4);
sprintf(c,"%2x",(mask & val));
printf("%sn",c);
}
x86平台下,gcc编译运行,结果如下:
Output use lld : val = 3,mask = 255
Output use 2x : val = 3,mask = 0
Output use 2x : mask = ff,val = 0
mask = ff
val = 3
3
3
PowerPC平台下,gcc编译运行,结果如下:
Output use lld : val = 3,mask = 255
Output use 2x : val = 30013000,mask = 0
Output use 2x : mask = 30013000,val = 0
mask = 30013000
val = 30013000
30013000
0
均不能完全正确。
不知什么原因,但是如果使用long或者int代替long long 定义,就没有问题。
各位高手指教一二啊!
小弟谢了,先!
|
这个应该算是你的测试程序的问题。
提供给printf的格式信息必需得和提供给printf的参数一模一样才行。
对于unsigned long long应该使用"%2llx"而不是"%2x"
提供给printf的格式信息必需得和提供给printf的参数一模一样才行。
对于unsigned long long应该使用"%2llx"而不是"%2x"
|
在x86下是可以理解的 反汇编看一下也能知道
printf("Output use 2x : val = %2x,mask = %2xn",val,mask);
printf("Output use 2x : mask = %2x,val = %2xn",mask,val);
0x80483d8 : pushl 0xfffffff4(%ebp)
0x80483db : pushl 0xfffffff0(%ebp)
---Type to continue, or q to quit---
0x80483de : pushl 0xffffffec(%ebp)
0x80483e1 : pushl 0xffffffe8(%ebp)
0x80483e4 : push $0x8048560
0x80483e9 : call 0x80482ac
在栈上虽然把16个字节都压进去了 但是printf的实现 看到%2x 只会往上
跳4个字节 自然都是0.
不过 ppc 就搞不懂是怎么回事了 也没有这机器 能看看汇编之后的代码
printf("Output use 2x : val = %2x,mask = %2xn",val,mask);
printf("Output use 2x : mask = %2x,val = %2xn",mask,val);
0x80483d8 : pushl 0xfffffff4(%ebp)
0x80483db : pushl 0xfffffff0(%ebp)
---Type to continue, or q to quit---
0x80483de : pushl 0xffffffec(%ebp)
0x80483e1 : pushl 0xffffffe8(%ebp)
0x80483e4 : push $0x8048560
0x80483e9 : call 0x80482ac
在栈上虽然把16个字节都压进去了 但是printf的实现 看到%2x 只会往上
跳4个字节 自然都是0.
不过 ppc 就搞不懂是怎么回事了 也没有这机器 能看看汇编之后的代码