1. Endianidad
Poco conocimiento adicional
1Tbyte = 1024Gbyte,
1Gbyte = 1024Mbyte,
1Mbyte = 1024Kbyte, (1Mb = 1024x1024 bytes)
1Kbyte = 1024byte, (1KB = 1024 bytes)
1byte = 8bit (un byte consta de 8 bits binarios)
int i; el tipo int ocupa 4 bytes, lo que significa 4x8 = 32 bits (el número máximo que se puede representar es 2 ^ 31-1 = 2147483647)
doble i; el tipo doble ocupa 8 bytes, lo que significa 8 * 8 = 64 bits Bits (el número máximo que se puede representado es 2 ^ 63-1)
Además: lo que vemos a menudo es int i = 0xff, es decir, solo hay dos ffs después de 0x, que es omitir los seis 00 00 00 delante de ff Zero, que significa que el original int i = 0x000000ff, debido a que el significado de 0xff = 0x000000ff es el mismo, los principiantes deben prestar atención.
Suponga int a = 0x12345678;
que cada número hexadecimal ocupa 4 bits; en la memoria, 8 bits se utilizan como 1 byte. Por lo tanto 0x12345678
, cada dos bits se consideran 1 byte, donde 0x78 es el byte bajo y 0x12 es el byte alto.
Hay dos métodos de almacenamiento en la memoria:
0x12345678
el bit bajo (0x78) tiene una dirección baja, es decir, el modo 1, llamado little endian;
0x12345678
el bit alto (0x12) tiene una dirección baja, es decir, el modo 2, llamado orden de bytes grandes ( Big endian);
Los chips de brazo generales están en little endian, algunos procesadores pueden establecer un cierto registro para que todo el sistema utilice big endian o little endian. Little-endian y big-endian lo llamamos modo big-endian y modo little-endian. De hecho, el significado de hacerse más grande es el mismo.
2. Manipulación de bits
2.1 Cambio lógico
En el desarrollo incrustado, solo involucramos cambios lógicos: no nos importa el bit de signo, todos son
cambios aritméticos llenos de ceros , que deben dividirse en valores con y sin signo:
- Para valores sin signo, el desplazamiento aritmético es equivalente al desplazamiento lógico.
- Para valores con signo, el desplazamiento aritmético a la izquierda es equivalente al desplazamiento lógico a la izquierda; el desplazamiento aritmético a la derecha complementa el bit de signo, más 0 para números positivos y 1 para números negativos.
2.1.1 Desplazamiento lógico a la izquierda
int a = 0x123; int b = a<<2; // b=0x48C
2.1.2 Desplazamiento lógico a la derecha
int a = 0x123; int b = a>>2; // b=0x48
2.2 Invertir
unsigned int a = 0x123;
unsigned int b = ~a; // b的每一位,都是a对应位的取反
2,3 bits y
unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a & b; // c等于a位与b,即:a,b的每一位进行与操作
Los dos son AND, y los resultados son los siguientes:
1 & 1 = 1
1 & 0 = 0
0 & 1 = 0
0 & 0 = 0
Por lo tanto, el resultado del código de lenguaje C anterior se muestra en la siguiente figura:
2,4 dígitos o
unsigned int a = 0x123;
unsigned int b = 0x456;
unsigned int c = a | b; // c等于a位或b,即:a,b的每一位进行或操作
Los dos bits se colocan en OR y los resultados son los siguientes:
1 | 1 = 1
1 | 0 = 1
0 | 1 = 1
0 | 0 = 0
Por lo tanto, el resultado del código de lenguaje C anterior se muestra en la siguiente figura:
2.5 Establecer
unsigned int a = 0x123;
unsigned int b = a | (1<<7) | (1<<8); // 设置a的bit7, bit8, 赋给b
2.6 Compensación
unsigned int a = 0x123;
unsigned int b = a & ~((1<<7) | (1<<8)); // 清除a的bit7, bit8, 赋给b
2.7 Establecer ciertos bits a un cierto valor
Por ejemplo, para establecer el bit7 en 1 y borrar el bit8 en 0, esto se puede hacer en dos pasos: primero establecer el bit7 y luego borrar el bit8. Hay otra situación: bit [8: 7] = val, no sé cuál es el valor de val, ¿qué debo hacer? Primero borre bit8, bit7 y luego agregue val, el código es el siguiente:
unsigned int a = 0x123;
unsigned int b = a & ~(3<<7); /* 清除bit7, bit8 */
b = b | (val << 7); /* 设置bit7, bit8为val */