2014-02-12 4 views
0

Я хочу иметь переменную данных, которая будет целочисленной, а ее диапазон будет от 0 - 1.000.000. Например, обычные переменные int могут хранить числа от -2,147,483,648 до 2,147,483,647. Я хочу, чтобы новый тип данных имел меньший радиус действия, поэтому он может иметь МЕНЬШИЙ РАЗМЕР.Сделайте свой собственный диапазон данных в C++

Если есть способ сделать это, пожалуйста, дайте мне знать?

+0

Вам нужно только их хранить или вы сделаете какую-либо арифметику? – Michael

+0

Целочисленный тип, который имеет меньший диапазон, намного проще, чем тот, который имеет меньший диапазон * и * имеет меньший размер. Вы понимаете, что ваше значение от 0 до 1 миллиона потребует 63% от размера стандартного целого числа и будет намного медленнее? – Yakk

ответ

1

Не существует; вы не можете указать произвольные диапазоны для таких переменных, как это в C++.

Вам нужно 20 бит для хранения 1 000 000 различных значений, поэтому использование 32-разрядного целого - это лучшее, что вы можете сделать, не создавая настраиваемый тип данных (даже тогда вы должны сохранить только 1 байт на 24 бита, так как вы не может выделять менее 8 бит).

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

0

У вас могут быть только типы данных, которые должны быть кратными 8 бит. Это связано с тем, что в противном случае тип данных не будет адресуемым. Представьте себе указатель на 5-битные данные. Этого не будет.

1

Итак, нет истинного ответа на эту проблему. Вот несколько мыслей, хотя:

  1. Если вы говорите о массиве этих 20 битных значений, то, возможно, ответы на этот вопрос будет полезно: Bit packing of array of integers

  2. С другой стороны, возможно, мы говорим об объекте, который имеет в нем 3 int20_t, и вы хотите, чтобы он занимал меньше места, чем обычно. В этом случае мы могли бы использовать бит.

    struct object { 
        int a : 20; 
        int b : 20; 
        int c : 20; 
    } __attribute__((__packed__)); 
    
    printf("sizeof object: %d\n", sizeof(struct object)); 
    

    Этот код будет, вероятно, печати 8, означающий, что он использует 8 байт пространства, а не 12, что вы обычно ожидаете.

Смежные вопросы