我试图用一个用C编写的简单控制台应用程序来庆祝StackOverflow上的10,000,000个问题,但我不想浪费任何内存。在内存中存储数字10,000,000的最有效方法是什么?
发布于 2015-08-21 18:30:30
数字10000000
(一千万)需要24位才能存储为无符号值。
大多数C实现都没有24位类型.任何符合1999年C标准或更高版本的实现都必须提供<stdint.h>
头,并且必须定义以下所有内容:
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t
每个类型都是(别名)至少具有指定宽度的无符号整数类型,因此没有任何较窄的整数类型至少具有指定的宽度。其中,uint_least32_t
是保证保存值10000000
的最窄的类型。
在绝大多数C实现中,uint_least32_t
是您所要寻找的类型--但是在支持24位整数的实现上,将有一种更窄的类型来满足您的需求。
这样的实现可能定义uint24_t
,假设它是无符号的24位类型没有填充位。所以你可以这样做:
#include <stdint.h>
#ifdef UINT_24_MAX
typedef uint24_t my_type;
#else
typedef uint_least32_t my_type;
#endif
这仍然不是100%可靠的(例如,如果有一个28位类型,但没有24位类型,这将错过它)。在最坏的情况下,它会选择uint_least32_t
。
如果您希望将自己限制为预定义类型(可能是因为您希望支持pre-C99实现),您可以这样做:
#include <limits.h>
#define TEN_MILLION 10000000
#if UCHAR_MAX >= TEN_MILLION
typedef unsigned char my_type;
#elif USHRT_MAX >= TEN_MILLION
typedef unsigned short my_type;
#elif UINT_MAX >= TEN_MILLION
typedef unsigned int my_type;
#else
typedef unsigned long my_type;
#endif
如果您只是希望最窄的预定义类型能够在所有实现上保持值10000000
(即使某些实现可能有一个更窄的类型可以容纳它),那么使用long
(int
可以是16位的窄值)。
如果不需要使用整数类型,则只需定义一个保证为3字节宽的类型:
typedef unsigned char my_type[3];
但实际上,这会比你需要的CHAR_BIT > 8
更广泛
typedef unsigned char my_type[24 / CHAR_BIT]
但如果24
不是CHAR_BIT
的倍数,这将失败。
最后,您的要求是表示数字10000000
;您没有说您需要能够表示任何其他数字:
enum my_type { TEN_MILLION };
或者,您可以定义一个1位字段,其值1表示10000000
,值0表示非10000000
。
发布于 2015-08-21 18:16:27
您要寻找的类型是int_least32_t
,来自stdint.h
,它将为您提供最少32位的最小类型。这种类型肯定存在于C99实现中。
精确宽度的类型(如int32_t
)并不一定存在,尽管您很难找到一个没有它的平台。
发布于 2015-08-21 18:29:32
从技术上讲,24位整数可以存储它,但是C中没有24位的基元类型。您必须使用32位的int
或long
。
对于性能而言,这将是最好的方法,浪费1个未使用的字节内存是无关紧要的。
现在,如果出于学习的目的,您真的想在最小的内存中存储1000万,并且您甚至愿意使用自己的数据存储方法来实现这一点,那么您可以通过定制一个遵循float
示例的存储方法,将其存储在一个字节内。您只需要4位来表示10,而其他3位则表示7,并且在1字节内包含计算pow(10, 7);
所需的所有数据。它甚至给你留下了一个额外的免费位,你可以用它作为符号。
https://stackoverflow.com/questions/32146709
复制相似问题