首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >什么是C中最小的数据类型,可以存储数字10,000,000?

什么是C中最小的数据类型,可以存储数字10,000,000?
EN

Stack Overflow用户
提问于 2015-08-21 18:04:45
回答 8查看 2K关注 0票数 2

我试图用一个用C编写的简单控制台应用程序来庆祝StackOverflow上的10,000,000个问题,但我不想浪费任何内存。在内存中存储数字10,000,000的最有效方法是什么?

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2015-08-21 18:30:30

数字10000000 (一千万)需要24位才能存储为无符号值。

大多数C实现都没有24位类型.任何符合1999年C标准或更高版本的实现都必须提供<stdint.h>头,并且必须定义以下所有内容:

代码语言:javascript
运行
复制
uint_least8_t
uint_least16_t
uint_least32_t
uint_least64_t

每个类型都是(别名)至少具有指定宽度的无符号整数类型,因此没有任何较窄的整数类型至少具有指定的宽度。其中,uint_least32_t是保证保存值10000000的最窄的类型。

在绝大多数C实现中,uint_least32_t是您所要寻找的类型--但是在支持24位整数的实现上,将有一种更窄的类型来满足您的需求。

这样的实现可能定义uint24_t,假设它是无符号的24位类型没有填充位。所以你可以这样做:

代码语言:javascript
运行
复制
#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实现),您可以这样做:

代码语言:javascript
运行
复制
#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字节宽的类型:

代码语言:javascript
运行
复制
typedef unsigned char my_type[3];

但实际上,这会比你需要的CHAR_BIT > 8更广泛

代码语言:javascript
运行
复制
typedef unsigned char my_type[24 / CHAR_BIT]

但如果24不是CHAR_BIT的倍数,这将失败。

最后,您的要求是表示数字10000000;您没有说您需要能够表示任何其他数字:

代码语言:javascript
运行
复制
enum my_type { TEN_MILLION };

或者,您可以定义一个1位字段,其值1表示10000000,值0表示非10000000

票数 3
EN

Stack Overflow用户

发布于 2015-08-21 18:16:27

您要寻找的类型是int_least32_t,来自stdint.h,它将为您提供最少32位的最小类型。这种类型肯定存在于C99实现中。

精确宽度的类型(如int32_t )并不一定存在,尽管您很难找到一个没有它的平台。

票数 7
EN

Stack Overflow用户

发布于 2015-08-21 18:29:32

从技术上讲,24位整数可以存储它,但是C中没有24位的基元类型。您必须使用32位的intlong

对于性能而言,这将是最好的方法,浪费1个未使用的字节内存是无关紧要的。

现在,如果出于学习的目的,您真的想在最小的内存中存储1000万,并且您甚至愿意使用自己的数据存储方法来实现这一点,那么您可以通过定制一个遵循float示例的存储方法,将其存储在一个字节内。您只需要4位来表示10,而其他3位则表示7,并且在1字节内包含计算pow(10, 7);所需的所有数据。它甚至给你留下了一个额外的免费位,你可以用它作为符号。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32146709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档