存储
int16类型数值500在ios内存上如何存储的 ?
在iOS内存中,int16类型的数值500将以两个字节的形式存储。int16是有符号的16位整数类型,可表示范围为-32768到32767。
500的二进制表示为00000001 11110100,其中最高位表示符号位,0表示正数。
这个二进制数将被存储在内存中的两个字节中,具体存储方式取决于系统的字节顺序(大端序或小端序)。
iOS是小端序. 00000001 11110100会被存储为 11110100 00000001。
int16类型数值-300 在ios内存上如何存储的 ?
iOS设备使用的是小端字节序(Little-Endian),这意味着在内存中,一个多字节值的最低字节位于最小的地址。
一个int16类型的数值-300,其二进制表示为补码形式,即先求出300的二进制形式,然后取反,再加1。
300的二进制形式为:00000001 00101100。取反得到:11111110 11010011,再加1得到:11111110 11010100,这就是-300的二进制表示。
在内存中,由于iOS设备采用小端字节序,所以-300(11111110 11010100)会被存储为 11010100 11111110。
注意,这里空格只是为了提高可读性,实际在内存中并无空格。
恢复
演示
#include <stdio.h>
#include <stdint.h>
#include <string.h>
int main()
{
// 假设你有一个char数组存储了这个值
unsigned char data[2] = {0xD4, 0xFE}; // 这是按照小端字节序存储的-300
// 1
int8_t *mByteData = reinterpret_cast<int8_t*>(data);
int16_t* int16_pointer0 = (int16_t*)mByteData;
// 之后你就可以按照int16_t来使用你的指针了,*int16_pointer就是-300
int16_t value0 = *int16_pointer0; // 这个值应该是-300
printf("value0 : %d\n", value0);
//2
// 然后,你可以将它转换为int16_t*
int16_t* int16_pointer = (int16_t*)data;
// 之后你就可以按照int16_t来使用你的指针了,*int16_pointer就是-300
int16_t value = *int16_pointer; // 这个值应该是-300
printf("value : %d\n", value);
printf("*int16_pointer : %d\n", *int16_pointer);
//3
unsigned char data2[2] = {0xD4, 0xFE};
// 首先,我们需要将这两个字节合并成一个无符号的16位整数
uint16_t unsignedValue = (data2[1] << 8) | data2[0];
// 然后,我们需要检查最高位的符号来判断是否需要进行符号扩展
int16_t signedValue;
if (unsignedValue & 0x8000) {
signedValue = unsignedValue | (~0xFFFF);
} else {
signedValue = unsignedValue;
}
printf("signedValue : %d\n", signedValue);
return 0;
}
输出
value0 : -300
value : -300
*int16_pointer : -300
signedValue : -300