Приведите char к int с нулевым расширением в C ++ - PullRequest
1 голос
/ 24 октября 2019

Я хочу написать функцию

int char_to_int(char c);

, которая преобразует данный символ в int с нулевым расширением значения. Таким образом, если у char есть N битов, а int имеет M битов, M> = N, то MN старших значащих битов значения int должны быть равны нулю, а N младших значащих битов значения int должны совпадать с битами значения char.

Это кажется простой задачей, но я не уверен, как написать ее, опираясь только на стандартное поведение. Нет UB, нет поведения, определенного для реализации. Не полагаясь на то, что char является 8-битным, int - 32-битным, char - без знака и любые другие распространенные предположения, которые не гарантированы стандартом.

Причина, по которой я хочу это знать, заключается в том, что я сделал этопреобразование несколько раз в прошлом, но недавно я узнал об ограниченных гарантиях, которые дает C ++ для своих типов данных. Так что теперь мне любопытно, какой правильный, стандартный подход соответствует.

Я не думаю, что

return (int) c;

достаточно хорошо, правда?

1 Ответ

2 голосов
/ 24 октября 2019

Нет ничего плохого в том, чтобы быть предельно ясным:

return int((unsigned char)c);

Таким образом, вы сообщаете компилятору именно то, что вам нужно: int, который содержит значение char, читается как unsigned. Таким образом, символ 255 станет целым 255.

...