Что такое мощность типов данных?
Разбираясь со структурами данных, наткнулся на понятие мощности. Например, #int = 2^(sizeof(int)*8). Также sizeof array = sizeof(Tdata) * #Tindex и #array = #Tdata^(#Tindex). Непонятно, что здесь Tdata, а что Tindex. Ещё хотелось бы увидеть примеры применения этих формул для каких - нибудь массивов. Допустим, как считать мощность массива int array[10] = {0, ... ,9}?
Ответы (1 шт):
Мощность структуры данных - количество различных значений, которое эта структура может хранить. Это характеристика типа структуры, но часто говорят фразы "мощность элемента массива" сокращая "мощность типа элемента массива". Или "мощность массива" вместо "мощность типа массива".
Мощность 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.