g++对函数局部变量的定义

编写如下程序:

#include <cstdio>
#include <iostream>
using namespace std;

int main()
{
	int a = 10;
	char b = 'a';
	int c = 20;
	printf("&a = 0x%08x \n", &a);
	printf("&b = 0x%08x \n", &b);
	printf("&c = 0x%08x \n", &c);
	cout << endl;

	char b1 = 'a';
	int a1 = 10;
	int c1 = 20;
	printf("&a1 = 0x%08x \n", &a1);
	printf("&b1 = 0x%08x \n", &b1);
	printf("&c1 = 0x%08x \n", &c1);
	cout << endl;

	struct
	{
		int a;
		char b;
		int c;
	} st;
	st.a = 10;
	st.b = 'a';
	st.c = 20;
	printf("&st = 0x%08x \n", &st);
	printf("&st.a = 0x%08x \n", &st.a);
	printf("&st.b = 0x%08x \n", &st.b);
	printf("&st.c = 0x%08x \n", &st.c);

	return 0;
}

 结果如下所示:

&a = 0xbf94c368 
&b = 0xbf94c36f 
&c = 0xbf94c364 

&a1 = 0xbf94c360 
&b1 = 0xbf94c36e 
&c1 = 0xbf94c35c 

&st = 0xbf94c350 
&st.a = 0xbf94c350 
&st.b = 0xbf94c354 
&st.c = 0xbf94c358 

 结果分析:

    在C++中,函数局部变量所占用的空间是在栈中的,而栈空间是随着压入变量的增多,自高地址向低地址生长。按照变量声明的顺序,压栈的顺序应该是(a, b, c, b1, a1, c1, c),而实际上为了保证内存中的数据对齐,压栈的顺序变成了(b, b1, a, c, a1, c1, c)。

 

    另外是关于大端与小端的问题。x86的CPU都是采用的小端存储方法。

    大端模式(big-edian),big-endian:MSB存放在最低端的地址上。举例,双字节数0x1234以big-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x12 |<-- 0x00002000
| 0x34 |<-- 0x00002001

    在Big-Endian中,对于bit序列中的序号编排方式如下(以双字节数0x8B8A为例):

bit | 0 1 2 3 4 5 6 7 | 8 9 10 11 12 13 14 15 |
------MSB----------------------------------LSB
val | 1 0 0 0 1 0 1 1 | 1 0  0  0  1  0  1  0 |
+--------------------------------------------+
= 0x 8 B 8 A

    小端模式(little-endian),little-endian:LSB存放在最低端的地址上。举例,双字节数0x1234以little-endian的方式存在起始地址0x00002000中:

| data |<-- address
| 0x34 |<-- 0x00002000
| 0x12 |<-- 0x00002001

    在Little-Endian中,对于bit序列中的序号编排和Big-Endian刚好相反,其方式如下(以双字节数0x8B8A为例):

bit | 15 14 13 12 11 10 9 8 | 7 6 5 4 3 2 1 0
------MSB-----------------------------------LSB
val | 1  0  0  0  1  0  1 1 | 1 0 0 0 1 0 1 0 |
+---------------------------------------------+
=0x 8 B 8 A

    假设有一个int类型的变量0x12345678,其地址是0xbfa42030,如果是小端存储,那么高字节在高位,低字节在低位,也就是说,0xbfa42030所对应的字节为0x78,0xbfa42031所对应的字节为0x56,0xbfa42030所对应的字节为0x34,0xbfa42030所对应的字节为0x12。同时,每个bit位的顺序也是低bit在低位,高bit在高位。

 

    判断机器是大端机还是小端机的代码:

#include<stdio.h>
int main(int argc, char * argv[])
{
    int a=1;
    char *p=(char *)&a;
    if(1==*p)
        printf("intel\n");
    else
        printf("moto\n");
    return 0;
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值