2013-09-16 2 views
0

У меня есть структура буфера с полемЧара в беззнаковый полукокс

char inc_factor; 

, который представляет собой количество байт для увеличения в массиве символов. Проблема в том, что он должен иметь возможность удерживать значение до 255. Очевидно, что самым простым решением является изменение его на unsigned char, но я не могу изменить определение поставляемой структуры. Функция:

Buffer * b_create(short init_capacity, char inc_factor, char o_mode) 

Принимает эти параметры и возвращает указатель на буфер. Мне было интересно, как я смогу установить номер 255 в подписанном символе.

+0

Вы пишете функцию 'b_create'? –

+0

Да, я пишу функцию b_create. Структура была предоставлена, но она должна иметь возможность принимать до 255 в качестве параметра –

+0

. Я не получаю его, если код вызова был указан, почему они пытаются передать значение btw от 0 до 255 значение?, I означает, что они ожидают char, а не unsigned char, но они передают значение, которое не вписывается в char ... – DGomez

ответ

4

Вы можете преобразовать тип:

unsigned char n = inc_factor; 

Подпись к беззнаковому преобразования корректно определенно и делает то, что вы хотите, так как все три символьных типа должны иметь одинаковую ширину.

Вы, возможно, должны быть осторожны на вызывающих конце (или когда вы храните char в вашей структуре) и сделать что-то вроде f(n - UCHAR_MAX) или так (с другой стороны, если это является отрицательным и char беззнаковыми, все хорошо).

+0

все равно необходимо сохранить inc_factor внутри структуры. buff-> inc_factor = n. Все равно вызовет переполнение. Также я не создаю код вызова ... только реализации всех функций –

+0

@JosipDorvak: Да, как я уже говорил в последнем абзаце ... –

+0

@JosipDorvak: Назначение inc_factor * не приведет к переполнению, просто переинтерпретация - битовая диаграмма остается той же и может быть передана между подписанными или неподписанными переменными char взаимозаменяемо. Как указал Керрек, вы должны быть осторожны в арифметических выражениях, поскольку это подразумевает неявное преобразование в int (более крупный тип). – Clifford

0

ВЫ МОЖЕТЕ бросить его.

(unsigned char)inc_factor = 250; 

И тогда вы могли бы прочитать его обратно и с броском:

if((unsigned char)inc_factor == 250) {...} 

Однако, это действительно не лучшие практики, это будет запутать любого, кто должен поддерживать код.

Кроме того, он не поможет вам, если вы передаете inc_factor в функцию, ожидающую подписанный символ.

Там нет никакого способа, чтобы прочитать это значение в качестве знакового полукокса и получить значение выше 128.

+0

Думаю, я мог бы сделать это в меру. Это для задания, поэтому ремонтопригодность на самом деле не имеет большого значения. В следующий день я получу ясность по этому вопросу. –

+1

'(unsigned char) inc_factor' не является lvalue в C. –

+0

Вы должны указать RHS задания, а не LHS:' inc_factor = (char) 250; '. Но приведение задает преобразование, которое делается неявно, поэтому это необязательно. Тем не менее, нужно использовать «неподписанный символ» перед сравнением. –

1

Lets использовать термин «байт», чтобы представляет собой 8-бит хранения в памяти.

Байт со значением «0xff» можно получить либо в виде символа без знака, либо в виде символа с подписью.

BYTE byte = 0xff; 
unsigned char* uc = (unsigned char*)&byte; 
signed char* sc = (signed char*)&byte; // same as "char", the "signed" is a default. 
printf("uc = %u, sc = %d\n", *uc, *sc); 

(Я решил использовать указатели, потому что хочу продемонстрировать, что базовое значение, хранящееся в памяти, такое же).

Выведу

uc = 255, sc = -1 

«подписал» номер использует один и тот же объем запоминающего устройства (количество бит) в качестве знака, но они используют прописную биту как флаг сказать процессор, следует ли рассматривать их как отрицательный или нет.

Битовая диаграмма, представляющая «255» (11111111) без знака, представляет собой тот же шаблон бита, который представляет -1. Битовая диаграмма «10000000» имеет значение 128 или -127.

Таким образом, вы можете сохранить число «255» в подписанном символе, сохранив «-1», а затем переведя его в беззнаковый int.

EDIT:

В-случае, если вам интересно: отрицательные номера начинаются "в верхней части" (т.е. 0xff/255) для удобства вычислений. Помните, что базовое хранилище представляет собой байт, поэтому, если вы берете «0xff» и добавляете 1, просто используя обычную математическую математику без знака, она выдает значение «0x00». Который является правильным значением для «i + 1», когда «i = -1». Конечно, это было бы нечетно, если отрицательные числа начинались с «-1», имеющего значение 0x80/​​128.

+0

К сожалению, я думал, что вопрос был помечен C++, заменил потоковые операторы хорошим ol 'printf :) – kfsone

+0

lol :) Я знаю обо всем этом. Просто значение должно быть положительным. Я всегда мог использовать его каждый раз, когда я его использую:/ –

+0

Существует много раз, когда у устаревшего кода есть API, который просто использует «char», потому что им было не так много (компиляторы были менее строгими), особенно с сетевыми данными и т. д. Так что просто бросьте его. Лично я бы переименовал переменную в реализации функции в «inc_factor_», а в качестве первой строки функции объявил 'unsigned char inc_factor = (unsigned char) inc_factor_; // для вас не будет декремента! '. – kfsone

Смежные вопросы