Что такое мощность типов данных?

Разбираясь со структурами данных, наткнулся на понятие мощности. Например, #int = 2^(sizeof(int)*8). Также sizeof array = sizeof(Tdata) * #Tindex и #array = #Tdata^(#Tindex). Непонятно, что здесь Tdata, а что Tindex. Ещё хотелось бы увидеть примеры применения этих формул для каких - нибудь массивов. Допустим, как считать мощность массива int array[10] = {0, ... ,9}?


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Мощность структуры данных - количество различных значений, которое эта структура может хранить. Это характеристика типа структуры, но часто говорят фразы "мощность элемента массива" сокращая "мощность типа элемента массива". Или "мощность массива" вместо "мощность типа массива".

Мощность int можно вычислить как INT_MAX - INT_MIN + 1. Ровно столько различных значений может хранить целое со знаком. Мощность unsigned равна UINT_MAX + 1. Мощность char - CHAR_MAX - CHAR_MIN + 1.

Если у вас нормальный компилятор, то мощность примитивного типа T равна 28*sizeof(T). Самое известное исключение - мощность bool. Она равна двум, хотя bool занимает один байт и по формуле мог бы принимать 256 значений.

Мощность структуры - произведение мощностей её полей. Здесь формула 28*sizeof(T) даёт сбой из-за выравнивания: структура struct { char c; int i; } скорее всего будет иметь sizeof восемь, но её мощность 28·232 = 240 что меньше чем обещанное формулой 264.

Мощность массива есть мощность его элемента в степени числа элементов: int a[10] имеет мощность (232)10 = 2320. И снова нельзя пользоваться формулой с sizeof если элементы массива выравниваются, например если это массив структур с выравниванием.

Мощность union - сумма мощностей элементов. Обычно мощности полей/элементов перемножаются, тут нет. Мощность union { char c; int i; } равна 28 + 232.

→ Ссылка