网站建议:179001057@qq.com

一个典型代码的分析

技术2022-05-12  1

 某论坛有人提出以下问题:

#include <iostream> using namespace std; int main() {     unsigned int a = 0x000000f7;     unsigned int *p = &a;     char *b = (char *)&a;     printf("x/n",*p);     printf("x",*b);     return 0; }   问:为什么*p,*b的输出结果不一样,若把a改为0x00000017,则输出结果一样。。。

我的解答:

根本原因,符号位扩展。

 

更详细点,可以概括为以下两点:

(1)32位cpu的栈是4字节对齐的,所以任何小于4字节的数据圧栈都要转化为4字节压入。所以,这就有了字节扩展的可能。关于字节扩展,有符号数的编译器以符号位扩展,无符号的以0扩展高位。

(2)printf是含有不定参数的。那么,这个函数如何确定自己本身有多少参数呢?其实奥秘就在与最前面的字串"x",对这个字串进行扫描,就可以确定后面有多少个参数,但参数的字节则无法确定,所以,取出来的数据必然是32位的,然后经过相应的处理输出结果。


最新回复(0)