一个关于C语言的奇怪问题
在TC2.0下运行这两个程序出现的结果不同,原因是什么,请各位帮忙解释一下
程序一:
main()
{long a=0x12345678;
printf( "%c\n ",a);
printf( "%d\n ",a);
printf( "%ld\n ",a);
}
运行结果为:
x
22136;
305419896
这个是可以理解的!
程序二:
main()
{long a=0x12345678;
printf( "%c\n%d\n%ld\n ",a,a,a);
}
运行结果为:
x
4660
305419896
这个就不好理解了,请高手解释一下。
[解决办法]
mark.
[解决办法]
首先,在 TC 中,内存是按照 16 位来对齐的。
另外, C 对可变参数的实现就是全部推到堆栈中,实现那边决定怎样解释堆栈中的参数。
对第一种情况堆栈内容和解释方式为:
0x78 -> %c -\ --
0x56 -/ %d \ %ld
0x34 /
0x12 --
对第二种情况:
0x78 --> %c
0x56 ----------对齐补位
0x34 --\
0x12 --/ %d
0x78 --\
0x56 \ %ld
0x34 /
0x12 --/
0x78
0x56
0x34
0x12
[解决办法]
顶。。。
[解决办法]
关键是 第二个
0x78 --> %c
0x56 ----------对齐补位//因为是16位对齐,
0x34 --\ //把56填充在78下面
0x12 --/ %d //而%d是16位整取,
0x78 --\ //所以只可能去1234了
0x56 \ %ld
0x34 /
0x12 --/
0x78
0x56
0x34
0x12
[解决办法]
用sizeof()看一下long, int , char, 各占了几个字节就知道为什么错了啊
[解决办法]
有难度的,学习一下
[解决办法]
"茴"字有几种写法并不重要.```
[解决办法]
知道原理就可以了,X的ASIC是120