URL: https://www.opennet.ru/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7020
[ Назад ]

Исходное сообщение
"Почему array не возвращает значение 1го элемента массива?"

Отправлено geragray , 10-Дек-07 17:24 
Есть 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] не есть обращение к значению первого байта массива? Почему приходится делать финт ушами и выводить значение указателя на первый элемент того же самого массива? Заранее спасибо.


Содержание

Сообщения в этом обсуждении
"Почему array не возвращает значение 1го элемента массива?"
Отправлено Lord ArchDevil , 10-Дек-07 17:40 
>[оверквотинг удален]
>
>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 - всё нормально, поскольку старший бит не является знаковым.

Таким образом никакой ошибки получения значения из первого элемента массива нет, однако имеет весто "неправильная" для вас, но абсолютно правильная с точки зрения машинной арифметики интерпретация хранящегося в ячейке битового значения ;)


"Почему array не возвращает значение 1го элемента массива?"
Отправлено geragray , 10-Дек-07 18:08 
Точно! Спасибо.