求助,turbo c下65536的输出疑惑!!
请教各位c高手,在turbo c下输入如下程序:
main()
{ long a;
a=65536;
printf("a=%ld\n",a);
printf("a=%d,a=%ld\n",a,a);
}
运行结果为:
a=65536
a=0,a=1
疑问:长整型a直接输出没有问题,所以第一个输出结果没问题,当将a分别以基本整型和长整型输出时,结果不是很明白,由于turbo c下基本整型int为两字节,long为4字节,用printf输出时从右向左压栈,再从左向右依次取出吧,开始是%d输出,应该有一次类型转换,4字节截取两个低字节,65536两个低字节全都为0,所以结果a=0,可是后面一个输出a=1就不太明白了,望高手能指点一下,是不是我的理解有问题啊,谢谢!!!
[解决办法]
你是用的16位DOS模式?
假设左边是栈底 右面是顶 65536 = 0x00010000
则第一个堆栈先压高再压低 0001 0000 XXXX <-- XXXX 是第一个printf格式串地址 printf看到%1d知道取4个字节所以正确
第二个堆栈 0001 0000 0001 0000 XXXX <-- XXXX 是第二个printf格式串地址 printf先看到%d 就取两个字节 就是0000 打印0 然后看到%1d知道取4个字节 就是 00000001 打印1
原因就是这样 不过这倒是个以前没注意过的问题 我得找机会试试