Почему одни и те же типы разные? - PullRequest
3 голосов
/ 06 апреля 2011

Почему это (char подписан в моей реализации):

cout << std::is_same< char,signed char>::value;

выводит false?

Ответы [ 5 ]

6 голосов
/ 06 апреля 2011

Три типа были введены в разное время.

Из C99 Rational:

Указаны три типа char:
signed, обычный и unsigned.Простой char может быть представлен как подписанный или неподписанный в зависимости от реализации, как в предыдущей практике.Тип signed char был введен в C89, чтобы сделать доступным однобайтовый целочисленный тип со знаком в тех системах, которые реализуют обычный char как unsigned char.

Они должны оставаться отдельными типами в C ++, чтобы перегрузка на char была переносимой.

4 голосов
/ 06 апреля 2011

Если вы используете Visual Studio, см. Здесь: http://msdn.microsoft.com/en-us/library/cc953fe1.aspx

Компилятор C ++ обрабатывает переменные введите char, подписано char и не подписано символ как имеющий разные типы. Переменные типа char повышаются до Int, как будто они типа подписаны символом по умолчанию, если компиляция / J опция используется. В этом случае они обрабатываются как тип unsigned char и являются повышен до Int без знака расширение.

[Редактировать] Прямо из стандарта ISO C ++ 0x, п. 3.9.1 (стр. 71, http://www.open -std.org / jtc1 / sc22 / wg21 / docs / paper /2010/n3092.pdf):

Символы могут быть явно объявлены без подписи или подписи. Простой символ, подписанный char и unsigned char - это три различные типы.

2 голосов
/ 06 апреля 2011

char, signed char и unsigned char - это три различных типа, даже если char интерпретируется так же, как signed char интерпретируется вашим компилятором.

§3.9.1 / 1 из стандарта C ++ говорит

Обычный символ, символ со знаком и символ без знака - это три различных типа.

Другими словами, не думайте о char как о краткой форме signed char, потому что это не так.

Чтобы подчеркнуть, что типы могут отличаться , несмотря на то, что их интерпретация битов одинакова , рассмотрим следующие две структуры:

struct A
{
   int i;
};

struct B
{
   int i;
};

Они такие же? Конечно, нет. Точно так же, char и signed char являются различными типами.

Попробуйте это:

 cout << std::is_same<A,B>::value;
1 голос
/ 06 апреля 2011

C ++ Standard (цитирование рабочего проекта №3225, 2010-11-27)

3.9.1 Основные типы

Обычный символ, подписанный символ и неподписанный char - это три разных типа.

0 голосов
/ 06 апреля 2011

Это зависит от реализации, но если я правильно помню, я где-то читал, что эти два должны быть разными, чтобы отличать строки типа c от 8-битного числа со знаком.

...