Вопреки распространенному мнению, C имеет 4-битные целочисленные типы. Однако он не имеет объектов этих типов, только битовые поля (6.7.2.1/9, «Битовое поле интерпретируется как целочисленный тип со знаком или без знака, состоящий из указанного количества битов»). «):
#include <stdio.h>
typedef struct int4bit {
signed int value:4;
} int4bit;
int main() {
int4bit a, b, c;
a.value = 6;
b.value = 7;
c.value = a.value + b.value;
printf("%d\n", c.value);
}
Вывод этой программы с моим компилятором -3
, , однако это не гарантируется стандартом. Причина в том, что выражение a.value + b.value
имеет тип int
(из-за правил целочисленного продвижения, 6.3.1.1/2) и значение 13. Значение 13 не может быть представлено в 4-битном целом со знаком, и, следовательно, одно из двух происходят вещи: либо результат, определенный реализацией, либо сигнал, определяемый реализацией (6.3.1.3/3).
Короче говоря, все, что вы можете сделать, это проверить документацию вашего компилятора или запустить код и посмотреть, что он делает. Но этот результат, -3, вполне естественен для реализации с представлением дополнения 2s целочисленных типов со знаком.
Значение не может быть 13, потому что 13 не находится в диапазоне значений, представляемых 4-битным целым числом со знаком. Все разрешено, если реализация документирует это, например, это может быть -2, на машине дополнения 1 с без проверки переполнения. Не то чтобы вы, вероятно, когда-либо сталкивались с такой машиной ...
Это особый случай, потому что единственный способ получить 4-битный целочисленный тип - это битовое поле. В общем случае переполнение целочисленной арифметики со знаком является неопределенным поведением (6.5 / 5, «результат находится ... вне диапазона представимых значений для его типа»). В вашем примере нет арифметического переполнения из-за повышения до int
, поэтому диапазон поведения, доступный для реализации, ограничен - нельзя форматировать жесткий диск. Но если вы переполните int
, то вы полностью зависите от своего компилятора.