Есть 4х байтовый массив
char CNIP[4];В который я копирую таккже 4 байта
memcpy (CNIP, packet->payload + 16, 4);А затем пытаюсь вывести на экран первый байт (значение которого кстати в 10й сс = 130)
Вот такой
printf("test %.3d", CNIP[0]);Дает -126 на экране
А вот если написать так
unsigned char *p;
p = &CNIP;
printf("test %.3d", *p);На экране появляется искомое чисто 130
Собственно вопрос, разве CNIP[0] не есть обращение к значению первого байта массива? Почему приходится делать финт ушами и выводить значение указателя на первый элемент того же самого массива? Заранее спасибо.
>[оверквотинг удален]
>
>unsigned char *p;
>p = &CNIP;
>printf("test %.3d", *p);
>
>На экране появляется искомое чисто 130
>
>Собственно вопрос, разве CNIP[0] не есть обращение к значению первого байта массива?
>Почему приходится делать финт ушами и выводить значение указателя на первый
>элемент того же самого массива? Заранее спасибо.Элементарно.
(signed) char - 1 байтовое число в диапазоне -128 -> +127!
Иными словами, в двоичной системе счисления старший из 8ми битов отвечает за знак числа.
Теперь рассмотрим, что такое 130 - 10000010!
Старший бит (1) указывает, что число отрицательное и в кодировке signed char, как было правильно подмечено, оно равно -126. )
В unsigned же char - всё нормально, поскольку старший бит не является знаковым.Таким образом никакой ошибки получения значения из первого элемента массива нет, однако имеет весто "неправильная" для вас, но абсолютно правильная с точки зрения машинной арифметики интерпретация хранящегося в ячейке битового значения ;)
Точно! Спасибо.