计算机基础学习(第七章(摸))

计算机基础学习(第七章)

这里使用的两个源文件如下

  • main.c
#include<stdio.h>
int x = 7;
int y = 8;
void p1(void);
int main(){
 p1();
 printf("x = %d,y = %d",x,y); 
}
  • p1.c
double x;
void p1(){
 x = 3.14;
 printf("x(double) = %lf\n",x);
}

在使用gcc main.c p1.c -o proc来进行编译时,会提示警告,但编译会成功在这里插入图片描述
这是因为在p1.c中调用了printf函数却没有引用stdio.h库,并且在p1.c中有与main.c同名的变量x,虽然是强符号与弱符号有区别会使用强符号,但依旧会有警告,需要解决的话在p1.c前加上#include<stdio.h>且在p1.c的x的声明前加上extern后就没有警告了。这里不作修改。
运行结果如下:
在这里插入图片描述
出现这种结果是因为main.c中的x与p1.c中的x所位于的首地址为同一个位置,就相当于是共用体的感觉,而因为main.c中的x与y相邻,也就是说八个字节中,前四个字节为x后四个字节为y,而对于p1来说这八个字节都是x,因此修改p1中的x会同时使得main中的x与y发生改变至于为什么,会是图上的值,这里仅解释main中的x

因为浮点数的表示占64位,1位符号位,11位阶码,52位尾数,因为数值为3.14,因为V = (-1)s×M×2E,把3.14除2得到1.57,所以2E = 2,所以E = 1,而E = exp - bias(2k-1-1)而在这里bias = 211-1-1 = 1023,所以exp = 1024,所以11位阶码为100 0000 0000,因为其为规格化的值(exp不全为1或全为0),所以尾数表示的为0.57(因为开头会隐含1,所以尾数表示0.57),而0.57 = 1.14/2 = 1/2 + 0.14/2 = 1/2 +0.28/22 = 1/21 + 1/24 + 1/28 + 1/29 + 1/210 + 1/211 + 1/213 + 1/215 + 1/216 + 1/217 + 1/222 + 0.28/222(开始循环),所以说浮点数的前32位是,0100 0000 0000 1001 0001 1110 1011 1000也就是说按照整数的计算可得230 + 219 + 216 + 212 + 211 + 210 + 29 + 27 + 25 + 24 + 23 = 1074339512

在这里插入图片描述与运行结果中的y相同,按照道理来说应当算出来是x的值,也就是说这可能与机器的位级排列有关,为了验证另一种可能性尝试运行下列main.c代码

#include<stdio.h>
int main(){
 int x[2];
 x[0] = 1374389535;
 x[1] = 1074339512;
 double *p = &x;
 printf("%lf",*p);
}

得到的结果为
在这里插入图片描述显然这并不是因为没有对齐,关于为什么是前32位,这是因为楼主被栈的增长方式误导了,在其他地方的存储是从低地址向高地址增长,也就是说y会放在x的上面,又因为机器为小端法,低字节放在低地址,从后往前取8个字节,y在x的上面,也就是说前32位表示的是y的值。

欢迎大家指出不足与缺点,谢谢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值