问下有没有人来解答一二

假设一个C语言程序有两个源文件:main.c和procl.c,它们的内容如图所示。
a)main.c文件
1 #include <stdio.h>
2 unsigned x=257;
3 short y,z=2;
4 void procl(void);
5 void mian()
6 {
7 procl();
8 printf("x=%u,z=%d\n",x,z);
9 return 0;
10 }

b)procl.c文件
1 double x;
2
3 void procl()
4 {
5 x=-1.5;
6 }

回答下列问题。
(1)在上述两个文件中出现的返回哪些是强符号?哪些是弱符号?
(2)程序执行后打印的结果是什么?请分别画出第7行的procl()函数调用前、后,在地址&x和&z中存放的内容。若第3行改为“short=1,z=2;”打印结果是什么?
(3)修改文件procl,使得main.c能输出正确的结果(即x=7,z=2)。要求修改时不能改变任何变量的数据类型和名字。

// a)main.c文件
#include <stdio.h>
unsigned x=257;
short y,z=2;
void procl(void);
int main() // 题目里字母有问题
{
    procl();
    printf("x=%u,z=%d\n",x,z);
    return 0;
}

// b)procl.c文件
double x;

void procl()
{
    x=-1.5;
}

以下是编译之后的提示:
ld: warning: tentative definition of '_x' with size 8 from '/var/folders/kw/ywzc0sr91yl1fgffp6j4s5y00000gn/T/proc-43a858.o' is being replaced by real definition of smaller size 4 from '/var/folders/kw/ywzc0sr91yl1fgffp6j4s5y00000gn/T/main-5f3685.o'
执行结果:x=0,z=0

  1. 全局变量为外部符号,又初始值的变量为强符号,数据段全局变量区分配地址。未初始化的全局变量为弱符号,在bss段分配地址。bss在进程映射之前不存储数据,有段大小,但在可执行文件中不占空间
    所以main.c中强符号为:x, z 弱符号为y;procl中只有弱符号x.在进行符号决议时,两个对象文件中的x符号决议冲突,取强符号
  2. x=0,z=0。注意,此结果与机器CPU字节序有关,本答案为小端字节序下的答案
    procl()调用之前 &x位置的值为257, &z位置的值为2. 调用之后 &x紧邻的8个字节被赋值为double类型-1.5,
    根据IEEE754标准,双精度浮点-1.5 = -1.1 * 2^0 2进制表示为 1 00111111111 100...52个0...0
    在小端字节序的机器上,十六进制表示为0x0000 0000 0000 8ff9 分别对应变量地址&x = 0x0000 0000 &z=0x0000
    第三行改动后,y被放在了数据段,在x与z之间。打印结果将是 x=0, z=-16392
  3. 通过内存赋值方式,改为*(unsigned int *)(&x) = 7