Что значит знаковый тип

Преобразование типов

Всякий раз, когда в операторе используются два операнда, над одним из них или над обоими производится некоторый род преобразований. Например, short int и long int нельзя складывать напрямую. Вместо этого short int должен быть преобразован в long int , и, затем, два значения могут быть сложены.

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

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

Правила преобразования типов полностью раскрыты в последующих разделах.

Целочисленное расширение

Правило:
char , short int или битовое поле типа int в любой, знаковой или беззнаковой форме, или объект перечислимого типа всегда преобразуются в int . Если тип int недостаточен для хранения всего диапазона преобразуемого объекта, то он конвертируется в unsigned int .

signed или unsigned char всегда конвертируется в signed int без изменения значения.

В Watcom C/16 short int имеет тот же диапазон, что и int , поэтому signed short int конвертируется в signed int , а unsigned short int — в unsigned int без изменения значения.

Читайте также:  Супрессант аппетита что это значит

В Watcom C/32 signed или unsigned short int конвертируется в int без изменения значения.

Это преобразование называется целочисленным расширением.

Преобразования знаковых и беззнаковых целых

Правило:
Если беззнаковое целое конвертируется в целое любого размера, то, если значение может быть представлено новым типом, то оно остаётся без изменений.

Если беззнаковое целое конвертируется в более длинный тип (тип с большим диапазоном), то значение не изменится. Если оно преобразуется к типу с меньшим диапазоном и может быть этим меньшим диапазоном представлено, то значение останется без изменения. Если значение не может быть представлено и, если результат имеет знаковый тип, то конечный результат зависит от реализации. Если тип результата — беззнаковый, то результат — целое по модулю (1 + наибольшее беззнаковое число, которое можно хранить в этом более коротком типе).

В Watcom C/16 беззнаковые целые приводятся к более длинным типам заполнением старших битов нулями. Приведение к меньшим типам производится отбрасыванием старшей части большего типа.

Рассмотрим следующие примеры 32-битных величин ( unsigned long int ), которые сконвертированы к 16-битным ( signed short int или unsigned short int ):

long 32-битное
представление
16-битное
представление
signed short unsigned short
65538 0x00010002 0x0002 2 2
100000 0x000186A0 0x86A0 -31072 34464

Правило:
Если знаковое целое конвертируется к беззнаковому такой же или большей длины и значение неотрицательно, то значение остаётся без изменений.

Неотрицательное значение, хранимое в знаковом целом, может быть сконвертировано в эквивалентный или более длинный целый тип без влияния на значение. Отрицательное значение сначала конвертируется в знаковый тип такой же длины, что и результат, а затем к нему добавляется (1 + наибольшее беззнаковое число, которое может быть сохранено в результирующем типе), чтобы сконвертировать его к беззнаковому типу.

В Watcom C/16 знаковые целые приводятся к более длинным типам при помощи расширения знака (старший бит более короткого типа заполняет все старшие биты более длинного). Если более длинный тип — беззнаковый, то расширяемый знаковый бит затем считается беззнаковым значением.

Рассмотрим следующие примеры 16-битных величин ( signed short int ), которые сконвертированы в 32-битные ( signed long int и unsigned long int ):

signed short 16-битное
представление
32-битное
представление
signed long unsigned long
-2 0xFFFE 0xFFFFFFFE -2 4294967294
32766 0x7FFE 0x00007FFE 32766 32766

Правило:
Если знаковое целое конвертируется в более длинное знаковое целое, то значение не изменится.

Правило:
Если знаковое целое конвертируется в более короткий тип, то результат зависит от реализации.

В Watcom C/16 знаковые целые конвертируются в более короткий тип с сохранением младшей (менее значащей) части большего типа.

Преобразования типов с плавающей точкой в целые

Правило:
Если число с плавающей точкой преобразуется в целое, то дробная часть отбрасывается. Если значение целой части не может быть представлено целым типом, то результат — не определён.

Следовательно, конвертировать число с плавающей точкой в целое можно только в диапазоне того целого типа, в который это преобразование производится. См. раздел Целочисленные типы для уточнения диапазона целых.

Преобразования целых в типы с плавающей точкой

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

Округление чисел с плавающей точкой зависит от реализации. Техника, которую будет использовать компилятор можно узнать из макро FLT_ROUNDS , находящегося в заголовочном файле . Следующая таблица поясняет смысл различных значений:

FLT_ROUND Округление
-1 неопределённое
0 в сторону нуля
1 до ближайшего числа
2 в сторону плюс бесконечности
3 в сторону минус бесконечности

Компиляторы Watcom C/16 и C/32 будут округлять до ближайшего числа. (Значение FLT_ROUNDS равно 1.)

Правило:
Если значение с плавающей точкой конвертируется в больший тип с плавающей точкой ( float в double , float в long double , или double в long double ), то значение не изменится.

Правило:
Если тип с плавающей точкой преобразуется в тип с плавающей точкой с меньшим диапазоном, то результат — не определён, если значение выходит за границы меньшего типа. Если значение находится внутри диапазона, но не может быть представлено точно, то будет производиться округление, зависящее от реализации.

Компиляторы Watcom C/16 и C/32 будут округлять до ближайшего числа. (Значение FLT_ROUNDS равно 1.)

Арифметические преобразования

Всякий раз, когда два значения используются в бинарном операторе, в котором ожидаются арифметические типы (целые или с плавающей точкой), происходит неявное преобразование типа. Большинство бинарных операторов работают с двумя значениями одинаковых типов. Если два значения имеют разные типы, то тип с меньшим диапазоном всегда расширяется до типа с большим. Тип из таблицы, приведённой ниже, и тип находящийся под ним конвертируются в тип, находящийся выше в таблице.

long double
double
float
unsigned long
long
unsigned int
int

Помните, что любой тип, меньший int подвергается целочисленному расширению, чтобы привести его к int .

Следующая таблица демонстрирует типы результата при сложении различных типов:

Оператор Тип результата
signed char + signed char signed int
unsigned char + signed int signed int
signed int + signed int signed int
signed int + unsigned int unsigned int
unsigned int + signed long signed long
signed int + unsigned long unsigned long
signed char + float float
signed long + double double
float + double double
float + long double long double

Преобразование аргументов по умолчанию

Когда производится вызов функции, компилятор C проверяет, определена ли уже функция, либо есть ли у неё прототип. Если это так, то аргументы функции преобразуются к указанным типам. Если нет, то аргументы преобразуются как показано ниже:

  • все целочисленные аргументы подвергаются целочисленному расширению и
  • все аргументы типа float расширяются до double .

Если определение функции не содержит параметров, совпадающих с расширенными типами, то поведение не определено.

Источник

Типы данных в языке Си

Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и способ реализации хранения значений и выполнения операций.

Процесс проверки и накладывания ограничений на типы используемых данных называется контролем типов или типизацией программных данных . Различают следующие виды типизации:

  • Статическая типизация — контроль типов осуществляется при компиляции.
  • Динамическая типизация — контроль типов осуществляется во время выполнения.

Язык Си поддерживает статическую типизацию, и типы всех используемых в программе данных должны быть указаны перед ее компиляцией.

Различают простые, составные и прочие типы данных.

Простые данные

Простые данные можно разделить на

  • целочисленные,
  • вещественные,
  • символьные
  • логические.

Составные (сложные) данные

  • Массив — индексированный набор элементов одного типа.
  • Строковый тип — массив, хранящий строку символов.
  • Структура — набор различных элементов (полей записи), хранимый как единое целое и предусматривающий доступ к отдельным полям структуры.

Другие типы данных

  • Указатель — хранит адрес в памяти компьютера, указывающий на какую-либо информацию, как правило — указатель на переменную.

Программа, написанная на языке Си, оперирует с данными различных типов. Все данные имеют имя и тип. Обращение к данным в программе осуществляется по их именам (идентификаторам).

Идентификатор — это последовательность, содержащая не более 32 символов, среди которых могут быть любые буквы латинского алфавита a — z, A — Z, цифры 0 — 9 и знак подчеркивания (_). Первый символ идентификатора не должен быть цифрой.

Несмотря на то, что допускается имя, имеющее до 32 символов, определяющее значение имеют только первые 8 символов. Помимо имени, все данные имеют тип. Указание типа необходимо для того, чтобы было известно, сколько места в оперативной памяти будет занимать данный объект.

Компилятор языка Си придерживается строгого соответствия прописных и строчных букв в именах идентификаторов и лексем.

Верно Неверно
int a = 2, b;
b = a+3;
Int a=2; // правильно int
INT a=2; int a = 2, b;
b = A + 3; // идентификатор А не объявлен int a = 2;
b = a + 3; // идентификатор b не объявлен

Целочисленные данные

Целочисленные данные могут быть представлены в знаковой и беззнаковой форме.

Беззнаковые целые числа представляются в виде последовательности битов в диапазоне от 0 до 2 n -1, где n-количество занимаемых битов.

Знаковые целые числа представляются в диапазоне -2 n-1 …+2 n-1 -1. При этом старший бит данного отводится под знак числа (0 соответствует положительному числу, 1 – отрицательному).

Основные типы и размеры целочисленных данных:

Количество бит Беззнаковый тип Знаковый тип
8 unsigned char
0…255
char
-128…127
16 unsigned short
0…65535
short
-32768…32767
32 unsigned int int
64 unsigned long int long int

Вещественные данные

Вещественный тип предназначен для представления действительных чисел. Вещественные числа представляются в разрядной сетке машины в нормированной форме.

Нормированная форма числа предполагает наличие одной значащей цифры (не 0) до разделения целой и дробной части. Такое представление умножается на основание системы счисления в соответствующей степени. Например, число 12345,678 в нормированной форме можно представить как

12345,678 = 1,2345678·10 4

Число 0,009876 в нормированной форме можно представить как

0,009876 = 9,876·10 -3

В двоичной системе счисления значащий разряд, стоящий перед разделителем целой и дробной части, может быть равен только 1. В случае если число нельзя представить в нормированной форме (например, число 0), значащий разряд перед разделителем целой и дробной части равен 0.

Значащие разряды числа, стоящие в нормированной форме после разделителя целой и дробной части, называются мантиссой числа .

В общем случае вещественное число в разрядной сетке вычислительной машины можно представить в виде 4 полей.

  • знак — бит, определяющий знак вещественного числа (0 для положительных чисел, 1 — для отрицательных).
  • степень — определяет степень 2, на которую требуется умножить число в нормированной форме. Поскольку степень 2 для числа в нормированной форме может быть как положительной, так и отрицательной, нулевой степени 2 в представлении вещественного числа соответствует величина сдвига, которая определяется как

2 n -1,

где n — количество разрядов, отводимых для представления степени числа.

  • целое — бит, который для нормированных чисел всегда равен 1, поэтому в некоторых представлениях типов этот бит опущен и принимается равным 1.
  • мантисса — значащие разряды представления числа, стоящие после разделителя целой и дробной части в нормированной форме.
  • Различают три основных типа представления вещественных чисел в языке Си:

    Тип Обозна-
    чение в Си
    Кол-во бит Биты степени Мантисса Сдвиг
    простое float 32 30…23 22…0 127
    двойной точности double 64 62…52 51…0 1023
    двойной расширен- ной точности long double 80 78…64 62…0 16383

    Как видно из таблицы, бит целое у типов float и double отсутствует. При этом диапазон представления вещественного числа состоит из двух диапазонов, расположенных симметрично относительно нуля. Например, диапазон представления чисел типа float можно представить в виде:

    Пример : представить число -178,125 в 32-разрядной сетке (тип float ).

    Для представления числа в двоичной системе счисления преобразуем отдельно целую и дробную части:

    178,12510 = 10110010,0012=1,0110010001·2 111

    Для преобразования в нормированную форму осуществляется сдвиг на 7 разрядов влево).

    Для определения степени числа применяем сдвиг:

    0111111+00000111 = 10000110.

    Таким образом, число -178,125 представится в разрядной сетке как

    Символьный тип

    Символьный тип хранит код символа и используется для отображения символов в различных кодировках. Символьные данные задаются в кодах и по сути представляют собой целочисленные значения. Для хранения кодов символов в языке Си используется тип char .
    Подробнее о кодировке символов

    Логический тип

    Логический тип применяется в логических операциях, используется при алгоритмических проверках условий и в циклах и имеет два значения:

    В программе должно быть дано объявление всех используемых данных с указанием их имени и типа. Описание данных должно предшествовать их использованию в программе.

    Источник

    Оцените статью