C语言的强符号和弱符号深入理解
2016-11-05 12:21
232 查看
在C语言中,函数和初始化的全局变量(包括显示初始化为0)是强符号,未初始化的全局变量是弱符号。
对于它们,下列三条规则使用:
① 同名的强符号只能有一个,否则编译器报”重复定义”错误。
② 允许一个强符号和多个弱符号,但定义会选择强符号的。
③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。
mian.c中
func.c中
对于它们,下列三条规则使用:
① 同名的强符号只能有一个,否则编译器报”重复定义”错误。
② 允许一个强符号和多个弱符号,但定义会选择强符号的。
③ 当有多个弱符号相同时,链接器选择占用内存空间最大的那个。
mian.c中
#include <stdio.h> #include <stdlib.h> int x = 10;//强符号 符号是global int y = 10; void test(); int main() { printf("&x = 0x%x\n", &x); test(); printf("%d\n", x);//0 //思考的地方 printf("%lf\n", x);//0.000000 //编译器默认x就是整形的,就算打印lf也没用,相当于整形0强转为double的0 printf("%d\n", y);//1077149696 //思考的地方 double *p = &x;//直接取首地址 步长为8 的内存 printf("%lf", *p);//20.000000 //这里就能正常显示test中x = 20 system("pause"); }
func.c中
double x;//弱符号 void test() { //x += 50; //这里最好不用+= 因为原来的int x = 10 会被 10.0 覆盖 x的值就成了10.0 而且这里不是x变成了10.0,而是x与y共同的内存8字节 x = 20;//这里x是main中的x,但是赋值的类型确实依据这个文件中的double printf("func:x = %d\n", x);//func:x = 0 //这里是正常的 printf("func:x = %lf\n", x);//func:x = 20.000000 //这里是正常的 } /* 当执行第7行之后,x的内存就发生了变化 00 00 00 00 00 00 34 40 一字节16进制显示 00000000 00000000 00000000 00000000 00000000 00000000 00110100 01000000 转化为 2 进制 01000000 00110100 00000000 00000000 00000000 00000000 00000000 00000000 因为是小端字节序,所以我们重新排序 注意:01000000 00110100 00000000 00000000 刚好等于1077149696 0 10000000011 0100000000000000000000000000000000000000000000000000 第一位 正负 2-12位 指数 13-64 小数 0 1027 - 1023 0100000000000000000000000000000000000000000000000000 0 4 0100000000000000000000000000000000000000000000000000 最终变化 1.01*2^4 = 10100 = 20 计算结果 */
相关文章推荐
- 深入理解C语言-03-有符号数,定点数,浮点数
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断
- 【 c语言中无符号和有符号的加法运算】【深入理解】--【sky原创】
- 深入理解计算机系统(2.4)---C语言的有符号与无符号、二进制整数的扩展与截断
- 深入理解计算机系统学习之C语言中有符号与无符号数的转换
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘(yanglilibaobao )
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘(下)
- 深入理解C语言指针的奥秘(补充)
- 深入理解c语言指针的奥秘
- 深入理解C语言指针的奥秘
- 深入理解C语言指针的奥秘
- [转]深入理解C语言指针的奥秘