Во-первых, если вы хотите быть на 100% уверены, что ваши переменные хранятся в правильном порядке в памяти, вы должны поместить их в структуру.
Затем обратите внимание, что memcmp () обрабатывает ввод, который вы даете ему, какпоследовательность байтов, поскольку в ней нет предположений относительно характера данных, которые вы ей предоставляете.Подумайте, например, о следующем коде:
#include <stdio.h>
#include <stdint.h>
int main(int argc, char** argv) {
int32_t a, b;
a = 1;
b = -1;
printf( "%i\n", memcmp( &a, &b, sizeof( int32_t ) ) );
}
Он выдает -254 на моей машине с прямым порядком байтов, независимо от того, что a> b.Это потому, что он не имеет представления о том, что на самом деле является памятью, поэтому он сравнивает их как массив uint8_t.
Если вы действительно хотите визуализировать, как данные представлены на вашем компьютере, вы можете сначала использовать fwriteзаписать структуру в файл, а затем открыть ее с помощью вашего любимого шестнадцатеричного редактора (по моему опыту, wxHexEditor замечательно рассказывает вам, как выглядят данные, если они являются X-битным Y-порядковым входным механизмом).Вот источник:
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint8_t tmp1[2];
uint16_t tmp2;
} mytmp;
int main(int argc, char** argv) {
mytmp tmp;
tmp.tmp1[0] = 255;
tmp.tmp1[1] = 1;
tmp.tmp2 = 511;
FILE* file = fopen( "struct-dump", "w" );
fwrite( &tmp, sizeof( mytmp ), 1, file );
fclose( file );
}
Что касается обработки массива uint8_t как uint16_t, вы, вероятно, захотите объявить union или использовать приведение указателя.