Преобразование в короткое из символа, странные результаты? - PullRequest
1 голос
/ 02 октября 2010

Итак, мой код содержит следующее:

unsigned short num=0;
num=*(cra+3);
printf("> char %u\n",num);

cra - это символ *

Проблема в том, что он получает странные выходные данные, иногда выводя числа, например 65501 (явно не в пределах диапазона символа) Есть идеи?

Заранее спасибо!

Ответы [ 4 ]

6 голосов
/ 02 октября 2010

Очевидно, *(cra+3) - это char значения '\xdd'. Поскольку char подписано, это фактически означает -35 (0xdd в дополнении 2), то есть 0x ... fffffdd. Ограничение этого значения до 16-битного дает 0xffdd, то есть 65501.

Вам нужно сделать его unsigned char, чтобы оно давало число в диапазоне 0–255:

num = (unsigned char)cra[3];

Примечание:
1. Подпись char определяется реализацией, но обычно (например, в случае OP) она подписывается.
2. диапазоны signed char, unsigned char и unsigned short определяются реализацией, но обычно они равны -128–127, 0–255 и 0–65535 соответственно.
3. преобразование из signed char в unsigned char фактически составляет -35 + 65536 = 65501.

2 голосов
/ 02 октября 2010

char разрешено быть подписанным или неподписанным - очевидно, на вашей платформе оно подписано.

Это означает, что он может содержать значения, например -35.Такое значение не входит в диапазон, представляемый unsigned short.Когда число вне диапазона преобразуется в тип без знака, оно вводится в диапазон путем многократного сложения или вычитания значения, превышающего максимальное значение, представляемое в этом типе.значения до 65535, поэтому -35 вводится в диапазон путем добавления 65536, что дает 65501.

0 голосов
/ 02 октября 2010

unsigned short имеет диапазон (как минимум) 0 .. 65535 ( ссылка ), спецификатор формата % u печатает без знака int с диапазоном (обычно) 0 .. 4294967295 .Таким образом, в зависимости от значения cra вывод выглядит вполне разумным.

0 голосов
/ 02 октября 2010

cra - это просто указатель.

Ему не было выделено ни одного пробела в виде malloc или calloc.Поэтому его содержание не определено.*(cra + 3) оценивает содержимое местоположения на 3 байта перед положением cra (при условии, что char занимает 1 байт).Я считаю, что его содержимое также не определено.

unsigned short занимает 2 байта, по крайней мере, в моей системе.Следовательно, он может содержать значения от 0 до 65536.Итак, ваш вывод находится в заданном диапазоне

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...