在32位平台上定义的8位变量是如何存储的?

时间:2022-01-08 23:25:52
例如typedef unsigned char  uint8; 
uint8 a,b,c,d;
;
shi是每个变量占32位空间,还是占8个,如果是后者,那如何寻址,
另外,这是否跟系统和编译器有关?

12 个解决方案

#1


这和编译器有关,属于内存字节对齐问题
但可以自己设置
#pragma pack(1) //就占1个字节
#pragma pack(4) //就占4个字节

#2


连续定义的会独占或2或3或4个占32位,
现在一般的寻址单位都是4字节的.

#3


a,b,c,c各占一个byte,就相当于连续定义了四个unsigned char类型的变量。
上面说的什么字节对齐,应该适用于结构体内的定义,这儿还是不需要字节对齐的。

#4


在32位平台上定义的8位变量,
变量访问时只使用1个字节,
但是这个变量却要浪费4个字节,
就是说后面的3个字节不用,浪费了。

#5


直接寻址方式

#6


uint8 a,b,c,d;  //每个都只占一字节,合起来正好一个32位字.
有些情况,考虑到对齐问题,会浪费一些字节.
如:
uint8 a;
int   b;
这样a还是占用1字节,但是接下来3个字节被空出不用,因为b是4字节对齐方式.
即: a*** b

#7


不好意思,弄错了,每个uint8变量占8位,但是紧接着的3字节不可用,相当于耗费了32位.

#8


大家的意思是一般情况每个8位变量占32位存储空间,浪费3个8位空间,

#9


楼上的各位仁兄,按照你们的思路,你是否可以告诉我下面的程序输出什么:
char a, b, c;
int d, e, f;
int main(){

printf("%d---%d\n", ((int)&b-(int)&a), ((int)&c-(int)&b));
printf("%d---%d\n", ((int)&e-(int)&d), ((int)&f-(int)&e));
system("pause");
return 0;
}

#10


to:Rudy_zhuang(风筝)
我在VC6.0中试了一下,结果是:
1---1
4---4

#11


存储方式是否跟系统和编译环境有关

#12


存储方式是否跟系统和编译环境有关?

这句话本身是对的。

但是你的例子显然和这个主题有点偏差。如果是定义结构体,我想会比较明显。
如:
typedef struct
{
    char a;
    int  b;
}test_type;

#1


这和编译器有关,属于内存字节对齐问题
但可以自己设置
#pragma pack(1) //就占1个字节
#pragma pack(4) //就占4个字节

#2


连续定义的会独占或2或3或4个占32位,
现在一般的寻址单位都是4字节的.

#3


a,b,c,c各占一个byte,就相当于连续定义了四个unsigned char类型的变量。
上面说的什么字节对齐,应该适用于结构体内的定义,这儿还是不需要字节对齐的。

#4


在32位平台上定义的8位变量,
变量访问时只使用1个字节,
但是这个变量却要浪费4个字节,
就是说后面的3个字节不用,浪费了。

#5


直接寻址方式

#6


uint8 a,b,c,d;  //每个都只占一字节,合起来正好一个32位字.
有些情况,考虑到对齐问题,会浪费一些字节.
如:
uint8 a;
int   b;
这样a还是占用1字节,但是接下来3个字节被空出不用,因为b是4字节对齐方式.
即: a*** b

#7


不好意思,弄错了,每个uint8变量占8位,但是紧接着的3字节不可用,相当于耗费了32位.

#8


大家的意思是一般情况每个8位变量占32位存储空间,浪费3个8位空间,

#9


楼上的各位仁兄,按照你们的思路,你是否可以告诉我下面的程序输出什么:
char a, b, c;
int d, e, f;
int main(){

printf("%d---%d\n", ((int)&b-(int)&a), ((int)&c-(int)&b));
printf("%d---%d\n", ((int)&e-(int)&d), ((int)&f-(int)&e));
system("pause");
return 0;
}

#10


to:Rudy_zhuang(风筝)
我在VC6.0中试了一下,结果是:
1---1
4---4

#11


存储方式是否跟系统和编译环境有关

#12


存储方式是否跟系统和编译环境有关?

这句话本身是对的。

但是你的例子显然和这个主题有点偏差。如果是定义结构体,我想会比较明显。
如:
typedef struct
{
    char a;
    int  b;
}test_type;