如果int的范围达到32768,那么我必须输入大约50000的值并使用它,我想输入而不使用long ,如果可能的话,也可以不使用类型转换。有没有办法做到这一点。 我希望数据类型仅保留为。
答案 0 :(得分:2)
任何内置类型在任何意义上都不能改变或扩展。你必须切换到另一种类型。
int
类型具有以下requirements:
short
(sizeof(short) <= sizeof(int)
)这意味着,严格来说(虽然大多数平台使用int
至少32位),但您无法将值50000安全地存储在int
中。
如果您需要保证范围,请使用int16_t
,int32_t
或int64_t
。它们在标题<cstdint>
中定义。语言或标准库中没有任意精度整数类型。
如果您只需要观察有效整数的范围,请使用标题<limits>
:
std::cout << std::numeric_limits<int>::min() << " to " << std::numeric_limits<int>::max() << "\n";
答案 1 :(得分:1)
想到了几种可能性。
但是你永远都不能存储某些东西&gt; MAX_INT在int。
中答案 2 :(得分:1)
int取决于本机机器字,这实际上意味着它取决于3件事 - 处理器,操作系统和编译器。
唯一可以&#34;增加&#34; int foo;
(不是long foo;
,int不长)是:
您正在使用Turbo-C或传统的16位DOS编译器在现代计算机上进行编译,可能是因为您的大学要求您使用它,因为这是您的教授所知道的。切换编译器。如果您的教授坚持要您使用它,请切换大学。
您正在使用64位操作系统上的32位编译器进行编译。切换编译器。
64位计算机上有32位操作系统。重新安装64位操作系统。
您有32位处理器。买一台新电脑。
您有一个16位处理器。真的,买一台新电脑。
答案 3 :(得分:1)
您可以尝试使用unsigned int。它与int相同但具有正范围(如果你真的不想长时间使用)。
请参阅this了解数据类型范围
<强>建议:强> 您也可以考虑切换编译器。从你提到的int范围来看,似乎你使用的是16位编译器(可能是turbo c)。 16位编译器会将unsigned int范围限制为0-65536(2 ^ 16),并将int符号设置为-32,768到32,767。
答案 4 :(得分:0)
尝试将您的值(适合64位int)分成两个32位数据块,然后使用两个32位整数来存储它。不久前,我写了一些代码,帮助我将16位值分成8位值。如果稍微更改此代码,则可以将64位值分别分为两个32位值。
#define BYTE_T uint8_t
#define TWOBYTE_T uint16_t
#define LOWBYTE(x) ((BYTE_T)x)
#define HIGHBYTE(x) ((TWOBYTE_T)x >> 0x8)
#define BYTE_COMBINE(h, l) (((BYTE_T)h << 0x8) + (BYTE_T)l)
我不知道这是否有用,因为它实际上并未回答您的原始问题,但至少您可以通过这种方式存储您的值,即使您的平台仅支持32位整数
答案 5 :(得分:0)
这是一个在int中实际存储值大于MAX_INT的想法。它基于这样的条件:只有很小的,已知数量的可能值。
你可以写一个压缩方法来计算类似于2字节哈希的东西。散列必须与已知的一组可能值具有双射(1:1)关系。这样你实际上存储值(以压缩形式)在int中,而不是像以前那样存储在字符串中,因此扩展了可能值的范围,代价是无法表示< em>该范围内的每个值。
散列算法取决于可能值的集合。作为一个简单的例子,我们假设可能的值是2 ^ 0,2 ^ 1,2 ^ 2 ... 2 ^ 32767。明显的哈希算法是将指数存储在int中。存储值4表示值16,5表示32,1000表示接近10 ^ 301等的数字。可以看到一个可以存储&#34; 16位int中非常大的数字;-)。当然,较少规则的集合需要更复杂的算法。