cplusplus里数据类型的大小和存储方式

不同数据类型的大小

相同位数的系统下,每一个变量的地址大小相同

1
2
3
4
5
6
7
8
9
        int32_t va; int32_t* vb; double vc; double* vd; uint8_t ve; uint8_t* vf; intptr_t vg;

        int32_t a = sizeof(&va); //8
int32_t b = sizeof(&vb); //8
int32_t d = sizeof(&vc); //8
int32_t e = sizeof(&vd); //8
int32_t f = sizeof(&ve); //8
int32_t g = sizeof(&vf); //8
int32_t h = sizeof(&vg); //8

以上变量地址大小都是 8 ,因为在64位体统下。

相同位数的系统下,不同类型变量占有的空间大小不同

1
2
3
4
5
6
7
8
9
10
int32_t va; int32_t* vb; double vc; double* vd; uint8_t ve; uint8_t* vf; intptr_t vg;

int32_t a = sizeof(va); //4
int32_t b = sizeof(vb); //8
int32_t d = sizeof(vc); //8
int32_t e = sizeof(vd); //8
int32_t f = sizeof(ve); //1
int32_t g = sizeof(vf); //8
int32_t h = sizeof(vg); //8
int32_t i = sizeof(*vb); //4

这里*vb == vb[0]

不同位数的系统下,不同/相同变量占有的大小不同

当申请一块 uint_8* buff 时,系统划分出一个8字节的大小,存储了一个指向随机位置的指针。

buff = (uint_8*)calloc(seizeof(*buff) * 10,0 ); 时,buff指向了一块地址。这块地址保存的都是十个 1字节的uint_8数据。

1
2
3
4
5
6
7
8
        uint8_t* aa;
aa = (uint8_t*)zltCMemoryBasic::zlt_calloc(sizeof(*aa) * bufSizeB * 12, 0);

        aa[0] = 1; aa[1] = 2;
uint8_t a = aa[0]; //1
uint8_t c = aa[1]; //2
uint8_t b = *aa; //1
uint8_t d = *(aa+1); //2

uint8 int float double 怎么在计算机内存储

uint8:占一个字节八位, 无符号数,0~255,算数or逻辑左移右移就是左右移动,舍去移动的位数然后补零

int32 :四个字节32位,有符号数,最高位代表符号。

最大数2147483647的原码为0111 1111 1111 1111 1111 1111 1111 1111

最小数-2147483648的补码表示为1000 0000 0000 0000 0000 0000 0000 0000,在32位没有原码。

对有符号数逻辑左右移动不考虑符号,算数右移补符号位。

float32: 四字节32位,有符号数,最高位代表符号。E代表指数 2E M代表尾数

https://zhuanlan.zhihu.com/p/84453627