C: преобразование символа в int - PullRequest
4 голосов
/ 21 августа 2009

Из языка программирования Си (Брайан В. Керниган), 2.7 ТИП КОНВЕРСИЙ, стр. 43:

"Есть один тонкий момент о преобразование символов в целые числа. ... на некоторых машинах чарс самый левый бит 1 будет преобразован в отрицательное целое число. На других ... всегда позитивный. Для мобильности, указать подписанный или неподписанный, если не символьные данные должны храниться в переменные типа char. "

Мои вопросы:

  1. Почему кто-то хочет хранить не-char данные в char? (пример где это необходимо будет реально хороший)

  2. Почему целочисленное значение char изменить, когда он преобразуется в int?

  3. Не могли бы вы подробнее рассказать об этом? проблема переносимости?

Ответы [ 6 ]

6 голосов
/ 21 августа 2009

Относительно 1)

Люди часто используют массивы символов, когда им действительно нужен байтовый буфер для потока данных. Это не очень хорошая практика, но многие проекты делают это, и если вы будете осторожны, никакого реального вреда не будет. Возможно, есть и другие времена.

В отношении 2)

Знаковые целые числа часто расширяются знаком, когда они перемещаются из меньшего типа данных. таким образом 11111111b (-1 в базе 10) становится 11111111 11111111 11111111 11111111 при расширении до 32 бит. Однако, если символ должен был быть без знака +255, то целое число со знаком может в конечном итоге составить -1.

О переносимости 3)

Некоторые машины рассматривают символы как целые числа со знаком, тогда как другие интерпретируют их как беззнаковые. Это также может варьироваться в зависимости от реализации компилятора. Большую часть времени вам не нужно беспокоиться об этом. Керниган просто пытается помочь вам понять детали.


Редактировать

Я знаю, что это нерешенная проблема, но вы можете использовать следующий код, чтобы проверить, подписаны или не подписаны символы в вашей системе:

#include <limits.h> //Include implementation specific constants (MAX_INT, et c.)
#if CHAR_MAX == SCHAR_MAX 
// Plain "char" is signed
#else
// Plain "char" is unsigned
#endif
6 голосов
/ 21 августа 2009

1) char - это размер одного байта в C, поэтому он используется для хранения любых данных. Например, при загрузке изображения в память данные представляются в виде массива char. В современном коде typedefs, такие как uint8_t, используются для более полезного указания назначения буфера, чем просто char.

2 & 3) Независимо от того, подписан или не подписан char, зависит от платформы, поэтому, если программа зависит от этого поведения, то лучше указать одно или другое явно.

3 голосов
/ 21 августа 2009
  1. Тип char определен для хранения одного байта, т. Е. sizeof(char) определен как 1. Это полезно для сериализации данных, например.

  2. char определяется реализацией как unsigned char или signed char. Теперь представьте, что char означает smallint. Вы просто конвертируете небольшое целое число в большее, когда переходите от smallint к int. Проблема в том, что вы не знаете, является ли smallint подписанным или неподписанным.

  3. Я бы сказал, что это не проблема переносимости, если вы следуете Библии (K & R).

1 голос
/ 21 августа 2009

Обычно, в C, преобразование char в int и наоборот является проблемой, потому что стандартные API для чтения ввода / вывода символов используют int's для символьных аргументов и возвращаемых значений.См., Например, getchar(), getc() и putchar().

Кроме того, поскольку размер символа равен 1 байту, это удобный способ обработки произвольных данных в виде потока байтов.

1 голос
/ 21 августа 2009

1) Символьный символ реализован как один байт во всех системах, поэтому он согласован.

2) Бит, упомянутый в вашем вопросе, - это тот, который используется в однобайтовых целых числах для их целочисленности. Если значение int в системе больше одного байта, то при преобразовании char в int размер строки со знаком не изменяется, в противном случае это так. (есть также подписанные и неподписанные буквы)

3) Из-за постоянства реализации char многие библиотеки используют их как библиотеки Intel IPP (Intel Performance Primitives) и их двоюродные братья OpenCV.

1 голос
/ 21 августа 2009

unsigned char часто используется для обработки двоичных данных по одному байту за раз. Типичным примером являются строки UTF-8, которые не состоят строго из "символов".

Если знаковый символ равен 8 битам и установлен старший бит, это означает, что он отрицательный. Когда это преобразовывается в больший тип, знак сохраняется путем расширения старшего бита до старшего бита нового типа. Это называется «расширенным знаком».

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