В следующей программе я использовал ключевое слово unsigned.

#include <stdio.h>

int main()
{
        unsigned char i = 'A';
        unsigned j = 'B';
        printf(" i = %c j = %c", i, j);
}

Вывод:

 i = A j = B

unsigned char i эквивалентно unsigned j?

11
msc 6 Сен 2016 в 08:55

6 ответов

Лучший ответ

unsigned char i эквивалентно unsigned j?

Нет, когда спецификатор типа опущен и используется любой из спецификаторов signed, unsigned, short или long, предполагается int.

Это означает, что следующие объявления эквивалентны:

long a;
long int a;

unsigned short b;
unsigned short int b;

Проблема с подписью char заключается в том, что, когда signed или unsigned опущены, подпись зависит от реализации:

char x; // signedness depends on the implementation
unsigned char y; // definitely unsigned
signed char z; // definitely signed
24
Blagovest Buyukliev 6 Сен 2016 в 07:11

unsigned, int и char - это так называемые спецификаторы типа . Правила C о спецификаторах типов очень странные и иррациональные, иногда по причинам обратной совместимости.

Глава 6.7.2 / 2 стандарта C выглядит так:

  • signed char означает signed char.
  • unsigned char означает unsigned char.
  • char - это отдельный тип, отличный от двух вышеупомянутых, и может быть как со знаком, так и без знака. Зависит от компилятора.
  • short, signed short, short int или signed short int означает short.
  • unsigned short или unsigned short int означает unsigned short.
  • int, signed или signed int означает int.
  • unsigned или unsigned int означает unsigned int.
  • long, signed long, long int или signed long int означает long.

И так далее. Если вы думаете, что эта система не имеет особого смысла, это потому, что это не так.

Учитывая вышеизложенное, мы можем сказать, что unsigned char и unsigned относятся к разным типам.

Однако существует специальное правило случая (называемое «продвижение аргументов по умолчанию») для всех функций с переменным аргументом, таких как printf, в котором говорится, что все малые целые типы, такие как char, неявно повышаются до типа {{X2} }. Вот почему вы можете printf("%d" использовать как символы, так и целые числа. Точно так же %c работает с целыми числами, потому что для printf фактически невозможно получить реальный, не продвигаемый тип символа через свои параметры. Все, что тип int или меньше, будет отображаться как int на стороне printf.

10
Lundin 7 Сен 2016 в 06:15

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

Спецификатор формата %c для printf ожидает аргумент типа int (который является подписанным целочисленным типом). Аргумент unsigned char повышается до int, так что это нормально. Аргумент unsigned int не преобразуется в int, но в этом случае он работает (по причинам, которые я не буду вдаваться).

Обратите внимание, что символьные константы, такие как 'A', также имеют тип int.

5
Keith Thompson 6 Сен 2016 в 05:59

Нет, unsigned j совпадает с unsigned int j.

Согласно C11, глава §6.7.2, Спецификаторы типа

unsigned или unsigned int

Итак, очевидно, что при отсутствии int переменная все равно будет целой.

Тем не менее, чтобы устранить путаницу, в спецификации перечислены

  • unsigned char

...

  • unsigned или unsigned int

Как два разных спецификатора типа, поэтому очевидно, что они не совпадают.

3
Community 20 Июн 2020 в 09:12

Ответ - нет.

Когда вы не указываете тип в следующих случаях signed unsigned long short и назначаете номер по умолчанию, он принимается как int.

В случае персонажей

char a; // Depends on implementations.
signed char b; // Signed
unsigned char c; // Unsigned
2
Shravan40 6 Сен 2016 в 06:21

Немного зависит от компилятора и архитектуры, но, как правило, длина unsigned int составляет 4 или 8 байтов, а длина unsigned char обычно составляет 1 октет.

Это означает, что беззнаковый символ занимает от 4 до 8 раз больше места и может содержать гораздо большее число (например, беззнаковый может содержать число 1024, в то время как типичный беззнаковый символ может содержать только до 255). В зависимости от порядка байтов вашего процессора, первый октет unsigned может быть таким же, как версия unsigned char (или нет).

Пока вы не заботитесь об использовании памяти, ее переполнении или не пытаетесь делать странные вещи с указателями, это одно и то же. Но они начинают быстро отличаться, когда вы начинаете делать более забавные вещи на C.

0
BJ Black 6 Сен 2016 в 06:49