1. Размер объекта это число единиц памяти которое он занимает. За единицу памяти принимают объём занимаемый одним символом char. Количество бит в символе указывается в CHAR_BIT макросе.
2. Все объекты одного типа занимают одинаковый объем памяти.
3. Компьютеры подразделяются на две категории по порядку следования байт в слове:
-- Справа налево, или остроконечной, или little endian - адрес 32 битного слова совпадает с адресом его младшего байта
(Intel x86, Pentium)
-- Слева направо, или тупоконечной, или big endian - адрес 32 битного слова совпадает с адресом его старшего байта
(Morotolla)
Некоторые системы поддерживают одновременно два режима.
4. В некоторых компьютерах данные могут располагаться в памяти по любому адресу, в других на определенные типы налагаются условия выравнивания.
5. В C99 введен целочисленный тип intptr_t,uintptr_t достаточный для хранения указателя на любое данное, но формально не на функцию
6. Представление объекта в памяти есть последовательность бит. Представление необязательно должно задействовать все биты.
7. В C есть специальное значение, называемое нулевой указатель (null pointer) оно равно константе нулевого указателя. И преобразуется к нулевым указателям других указательных типов.
8. В С/С++ в литеральном выражении можно закодировать тип константы:
long -- l or L
long long -- ll or LL
unsigned -- u or U
unsigned long -- ul or UL
unsigned long long -- ull or ULL
отсутствие суффикса у константы с плавающей точкой -- double
допустимый суффикс у константы с плавающей точкой -- l -- long double
допустимый суффикс у константы с плавающей точкой -- f -- float
1. Тривиальные преобразование. Преобразование в идентичные типы.
2. С++ обращается с enum как отличными друг от друга и от целочисленных типов.
В C и C++ допустимо неявное преобразование из перечислимых типов в целочисленные, в C допустимо так же неявное преобразование из целочисленных в перечислимые, но в C++ это не разрешено.
3. Общим требованием при преобразовании целых типов является математическое равенство исходного и целевого значения
4. Если произошло переполнение при преобразовании в тип со знаком, то значение считается переполненным и технически неопределенным.
5. Если произошло переполнение при преобразовании в тип без знака, то конечное значение равно "уникальному значению" mod 2**n от результата. При использовании дополнению до двух преобразование в/из знаковых в без знаковых целых типов одинакового размера не требует никакого изменения битов.
6. Если конечный тип короче исходного и оба типа без знаковые - преобразование может быть выполнено отбрасыванием соответствующего количества старших бит.
7. Правило 6 так же действует для целых типов в 2-s complement notation.
8. При преобразовании из float значений в int, конечное значение должно по возможности быть равно исходному. Ненулевая дробная часть отбрасывается. Результат не определён если значение даже не может быть представлено приближенно.
9. В С преобразование в типы с плавающей точкой возможно только из арифметических типов.
10. В случае преобразования из double во float конечное значение должно быть равно к одному из двух значений, ближайших к исходному значению. Выбор округления зависит от реализации.
11. В случае невозможности преобразования из double или int в float в случае несовпадения диапазона целевого double типа , то значение не определено, аналогично "4" и "9"
12. Преобразование в struct, union недопустимо
13. Нулевой указатель может преобразован в указатель любого другого типа.
14. Преобразование указателя на функцию в указатель на данное и в другую сторону тоже - не разрешено в C++
15. Преобразование из типа массив типа T в указатель на тип T производится подстановкой указателя на первый элемент массива.
16. Аналогично имеется преобразование из "функция..." в "указатель на функцию...."
17. Значение любого типа может быть преобразовано в void
18. Преобразование в void* и обратно гарантирует восстановление исходного значения указателя
19. В C void* может быть неявно преобразован в указатель на любой тип, в С++ требуется явное приведение.
(Annex C, 4.10, C++2003 standart)
20. Над операндами унарных операций выполняются обычные унарные преобразования. Цель - уменьшение числа арифметических типов.
Массив типа T => указатель на первый элемент (не выполняется для &, sizeof)
Функция => указатель на функцию
Преобразования из целого типа рангом ниже int => в int
Преобразования из без знакового целого типа рангом ниже int, int представляет все значения => в int
Преобразования из без знакового целого типа рангом ниже int, но int не представляет все значения => в unsigned int
21. Над операндами бинарной операции выполняются по отдельности для каждого обычные унарные преобразования из 20, а затем обычные бинарные преобразования
Если кто-то из типа long double, double, float, в второй рангом ниже, то он кастуется к этому же значению
Если оба операнда без знаковые, то оба кастуются в без знаковому типу более высокого ранга
Если оба операнда знаковые, то оба кастуются в знаковому типу более высокого ранга
Без знаковый операнд, и операнда с типом со знаком меньшего ранга => без знаковый тип
Без знаковый операнд, и операнда с типом со знаком более высокого ранга => тип со знаком
22. В случае если прототип управляется многоточием, то выполняются обычные унарные преобразования над операндами, а так же float всегда преобразуется в double
23. Если отсутствует многоточие и вызов управляется полностью прототипом, то "22" не происходит