存储细节

在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码,可
以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补码表示的数
相加时,如果最高位(符号位)有进位,则进位被舍弃。正数的补码与其原码一致;负数的
补码:符号位为1,其余位为该数绝对值的原码按位取反,然后整个数加1。

char类型默认情况下是有符号的,其表示的值的范围为[-128,127],超出这个范围的值会产生溢出.

char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));    255

柔性数组到底如何使用呢?看下面例子:
typedef struct st_type
{
int i;
int a[0];
}type_a;
有些编译器会报错无法编译可以改成:
typedef struct st_type
{
int i;
int a[];
}type_a;        

sizeof(type_a) 得到的只有4 , 就是sizeof(i)=sizeof(int)。那个0 个元素的数组没有占用空间,而后我们可以进行变长操作了.

柔性数组其实与结构体没什么关系,只是“挂羊头卖狗肉”而已,算不得结构体的正式成员.

大端模式(Big_endian):字数据的高字节存储在低地址中,而字数据的低字节则存放在高地址中。()
小端模式(Little_endian):字数据的高字节存储在高地址中,而字数据的低字节则存放在低地址中。(大众化的存储模式)

union 型数据所占的空间等于其最大的成员所占的空间。对union 型的成员的存取都是
相对于该联合体基地址的偏移量为0 处开始,也就是联合体的访问不论对哪个变量的存取都
是从union 的首地址位置开始.

原文地址:https://www.cnblogs.com/lvpblog/p/2529017.html