Ну, я не верю, что в C ++ есть какой-то реальный безопасный способ хранения чисел без каких-либо проблем. Когда дело доходит до перемещения между машинами, оно эффективно и легко хранится без большой емкости.
Это очень точно, но он не будет поддерживать действительно безумные значения. Вы можете иметь до 7 цифр в любом месте, но вы не можете превышать 7 цифр с обеих сторон. Слева вы получите неточные результаты. Справа вы получите ошибку во время чтения. Чтобы устранить ошибку, вы можете выдать ошибку во время записи или выполнить «buffer [idx ++] & 0x7» для чтения, чтобы предотвратить выход за пределы 0 и 7 границ. Имейте в виду, что «& 0x7» работает только потому, что это степень 2 минус один. Что составляет 2 ^ 3 - 1. Вы можете сделать это только с этими значениями, например, 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023 и т.д ...
Так что вам решать, хотите вы это использовать или нет. Я чувствовал, что это был безопасный способ получить большинство ценностей, которые вам когда-либо понадобятся. В приведенном ниже примере показано, как он преобразуется в 4-байтовый массив, но для C ++ это будет символ *. Если вы не хотите выполнять деление, вы можете преобразовать массив POWERS_OF_TEN во вторичный массив с десятичными и кратными вместо него.
const float CacheReader::POWERS_OF_TEN[] =
{
1.0F, 10.0F, 100.0F, 1000.0F, 10000.0F, 100000.0F, 1000000.0F, 10000000.0F
};
float CacheReader::readFloat(void)
{
int flags = readUnsignedByte();
int value = readUnsignedTriByte();
if (flags & 0x1)
value = -value;
return value / POWERS_OF_TEN[(flags >> 1) & 0x7];
}
unsigned __int32 CacheReader::readUnsignedTriByte(void)
{
return (readUnsignedByte() << 16) | (readUnsignedByte() << 8) | (readUnsignedByte());
}
unsigned __int8 CacheReader::readUnsignedByte(void)
{
return buffer[reader_position] & 0xFF;
}
void CacheReader::writeFloat(float data)
{
int exponent = -1;
float ceiling = 0.0F;
for ( ; ++exponent < 8; )
{
ceiling = (POWERS_OF_TEN[exponent] * data);
if (ceiling == (int)ceiling)
break;
}
exponent = exponent << 0x1;
int ceil = (int)ceiling;
if (ceil < 0)
{
exponent |= 0x1;
ceil = -ceil;
}
buffer[writer_position++] = (signed __int16)(exponent);
buffer[writer_position++] = (signed __int16)(ceil >> 16);
buffer[writer_position++] = (signed __int16)(ceil >> 8);
buffer[writer_position++] = (signed __int16)(ceil);
}