int32的最大值是多少?

1378
我总是记不住那个数字,我需要一个记忆规则。

48
无符号数:2³²-1 = 4·1024³-1;带符号数:-2³¹ .. +2³¹-1,因为符号位是最高位。只需要学会2⁰=1到2¹⁰=1024并结合使用。1024等于1千,1024²等于1兆,1024³等于1吉。 - comonad
31
我一般记得每3位二进制数对应一个十进制数字左右,这让我能够大概估算:32位二进制数约等于10个十进制数字。 - Barmar
8
如果你学会至少辨认出这些数字的类型,它肯定能帮助调试。 - Dunaril
72
如果磁盘空间已满,删除所有的兆字节将会实现归档。(2个字母、1个字母、4个字母、7个字母、4个字母、8个字母、3个字母、6个字母、4个字母、7个字母) - UltraCommit
8
当int32不足以应对的情况:http://www.bbc.com/news/world-asia-30288542 - Balazs Nemeth
显示剩余13条评论
45个回答

46

只需取任何一个像样的计算器,选择十六进制模式并输入“7FFFFFFF”,然后切换到十进制模式。

2147483647。


150
任何一个好的计算器都可以计算出 2^31。 - Christoffer
17
我不知道2的31次方似乎有些冗长:/ - States
2
或者只需记住它的十六进制表示。 - Vernon
4
只需用十六进制写出来就可以了。或者使用 Int32.MaxValue/numeric_limits<int32_t>::max() - sehe
8
实际上是2的31次方减1。 - kupsef
1
任何支持十六进制的计算器都支持位运算,所以只需输入0并按下“NOT”按钮即可。 - phuclv

36

这是关于 2.1 * 10^9 的内容。不需要知道准确的 2^{31} - 1 = 2,147,483,647

C

你可以在C语言中这样找到它:

#include <stdio.h>
#include <limits.h>

main() {
    printf("max int:\t\t%i\n", INT_MAX);
    printf("max unsigned int:\t%u\n", UINT_MAX);
}

给出(好吧,不包括,
max int:          2,147,483,647
max unsigned int: 4,294,967,295

C++ 11

std::cout << std::numeric_limits<int>::max() << "\n";
std::cout << std::numeric_limits<unsigned int>::max() << "\n";

Java

你也可以使用Java来实现这个功能:

System.out.println(Integer.MAX_VALUE);

请注意,Java整数始终带有符号。

Python 2

Python具有任意精度的整数。但在Python 2中,它们被映射到C整数。因此,您可以执行以下操作:

import sys
sys.maxint
>>> 2147483647
sys.maxint + 1
>>> 2147483648L

当整数大于2^31 -1时,Python会切换到long


Python的答案已经过时,请参见:https://dev59.com/MmYr5IYBdhLWcg3wR4Ys - NOhs
@NOhs 感谢提供链接,但我的 Python 回答是关于“Python 2”的(我在标题中加入了2以使其更清晰)。因此,我的回答并不过时。(但是 Python 2 确实已经过时了) - Martin Thoma

35

这里有一个记住 2**31 的助记法,减去一就是最大的整数值。

a=1,b=2,c=3,d=4,e=5,f=6,g=7,h=8,i=9

Boys And Dogs Go Duck Hunting, Come Friday Ducks Hide
2    1   4    7  4    8        3    6      4     8
我经常使用2的幂次方,一直记得到18次方,但我甚至没有费心去记忆2**31。这个数太容易根据需要进行计算或使用常量,或者估算为2G。

我经常使用2的幂次方,一直记得到18次方,但我甚至没有费心去记忆2**31。这个数太容易根据需要进行计算或使用常量,或者估算为2G。


3
2的10次方、2的11次方、2的12次方和2的17次方都包含零。 - supercat
2
@supercat 我会将a=0进行rebase,或者使用o=0。 - Mark Ransom

31

32位,其中1位用于符号,31位用于信息:

2^31 - 1 = 2147483647

为什么是-1?
因为第一个数是零,所以最大的数是计数减一

针对cantfindaname88的修正

计数为2^31,但最大的数不能是2147483648(2^31),因为我们是从0开始计数,而不是1。

Rank   1 2 3 4 5 6 ... 2147483648
Number 0 1 2 3 4 5 ... 2147483647

只需要3位二进制位的另一个解释:1位用于符号,2位用于信息。

2^2 - 1 = 3

以下是3位二进制数可能的所有取值:(2^3 = 8个数值)

1: 100 ==> -4
2: 101 ==> -3
3: 110 ==> -2
4: 111 ==> -1
5: 000 ==>  0
6: 001 ==>  1
7: 010 ==>  2
8: 011 ==>  3

@cantfindaname88:2^31 = 总组合数,因此范围从0到(2^31-1)。是的,第一个是0。 - Luciano

30

这个数有32位,因此可以存储2^32个不同的值。其中一半是负数。

最大的可表示值为2,147,483,647

最小的可表示值为−2,147,483,648。

(请注意,还有一个额外的负值。)


它有32位,因此可以存储2^32个值。不少于这个数。 - JB.

28

好的,除开玩笑,如果你真正想要一个有用的记忆规则,这里有一个方法我经常用来记忆大数字。

你需要将数字分成由3到4个数字组成的部分,并且使用手机键盘上的投射方式进行可视化记忆。下面图片更容易理解:

enter image description here

如您所见,从现在开始您只需要记住3个形状,其中2个看起来像俄罗斯方块L形,另一个像打勾号。 这绝对比记忆10位数要容易得多。

当你需要回忆数字时,只需回忆形状,想象一下/查看一下手机键盘并对其进行投影即可。 也许最初你需要看一下键盘,但是只需要稍微练习一下,你就会记得数字是从左上角到右下角排列的,所以你可以在脑海中简单地想象它。

只需确保您记住形状的方向和每个形状中数字的数量(例如,在2147483647示例中,我们有一个由四位数字组成的俄罗斯方块L形和一个由三位数字组成的L形)。

您可以使用此技术轻松记住任何重要数字(例如,我记住了我的16位信用卡号等)。


好主意!形状1给你2147,形状2给你483,形状3应该给你647,但是如图所示,它可以被解释为6547。我怎么知道何时包括所有的交叉数字(如形状1),而何时跳过一些数字(如形状3)?你还必须记住,这些形状分别编码4、3和3个数字。或者你可以用从6到4的弧线来画形状3,而不是直线。 - jskroch
@Squinch 嗯,特别是对于记住int.Max来说,这不应该是个问题,因为你可能知道它大约是20亿,所以它有10个数字(这意味着如果第一个形状有4个数字,那么第二个和第三个形状分别有3个)。然而,如果你想用这种方法记住任何数字,这是一个好点。另外,有些数字很难用这种方式记忆(比如1112或其他一些数字)。另一方面,无论如何记住这样的数字也不应该很困难。所以我想说这取决于你,如果你有什么有趣的想法,请告诉我 :) - Ivan Yurchenko
是的,我曾考虑使用这种方法来记忆任意序列的数字,但对于此int.Max值,您的方法运作得相当不错。正如您所说,重复的数字是一个问题。实际上,任何重复的序列(如2323)都是一个问题。任何交叉的序列(例如2058)都很难绘制。任何记忆技巧都需要您记住几个信息片段。什么类型的信息最容易记住,这取决于个人喜好。 - jskroch
1
这就是我记住密码和类似东西的方式,但突然之间你需要在电脑上输入它,并意识到数字键盘是垂直翻转的。所以这有点具有挑战性。 - nibarius
达拉斯(得克萨斯州)的某人收到了许多奇怪的电话,而他们不知道是你@IvanYurchenko在搞鬼。 - Bob Stein

21

首先将47写两遍,(你喜欢特工47,对吧?),保留空格(每个短横线代表一个数字槽。先是2个槽,然后是4个槽)

--47----47

假设你手头有 12(因为12等于一打)。将其乘以代理47号码的第一个数字,即47的第一个数字4,并将结果放在你已经拥有的第一对数字的右侧。

12 * 4 = 48
--4748--47 <-- after placing 48 to the right of first 47

然后将 12 乘以 3(为了使代理人47号的数字的第二位是7,您需要 7-4=3),并将结果放在第一对数字右侧,即最后一个空位。
12 * 3 = 36
--47483647 <-- after placing 36 to the right of first two pairs

最后,从您手中逐个拖动数字,从最右边的数字(在本例中为2)开始,并将它们放入您获得的第一个空插槽中。
2-47483647 <-- after placing 2
2147483647 <-- after placing 1

就是这样!对于负数限制,你可以将其视为绝对值比正数限制多1。

多练习几次,你就会掌握它的!


21

对于整数来说,最简单的方法是使用十六进制,前提是没有类似于Int.maxInt()这样的东西。原因如下:

最大无符号值

8-bit 0xFF
16-bit 0xFFFF
32-bit 0xFFFFFFFF
64-bit 0xFFFFFFFFFFFFFFFF
128-bit 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF

有符号值,最大有符号值为7F

8-bit 0x7F
16-bit 0x7FFF
32-bit 0x7FFFFFFF
64-bit 0x7FFFFFFFFFFFFFFF

使用有符号值,最大有符号值为80。

8-bit 0x80
16-bit 0x8000
32-bit 0x80000000
64-bit 0x8000000000000000

这是怎么工作的?这非常类似于二进制策略,每个十六进制数字恰好相当于4个比特位。另外,许多编译器在支持十六进制方面比支持二进制更好。

F hex to binary: 1111
8 hex to binary: 1000
7 hex to binary: 0111
0 hex to binary: 0000

所以7F等于01111111 / 7FFF等于0111111111111111。如果你要用它来表示“极高的常量”,那么7F是安全的十六进制,但很容易尝试一下7F和80并将它们打印到屏幕上以查看哪个是正确的。

0x7FFF + 0x0001 = 0x8000,所以你只损失了一个数字,因此通常使用0x7F...对于更可靠的代码而言不失为一个好的权衡,特别是当你开始使用32位或更多时。


20

2GB

(回答的最小长度是多少?)


9
@JoukevanderMaas - 实际上,应该是4B。 - Ted Hopp
1
这就是为什么32位计算机的RAM限制为4GB的原因。 - Serj Sagan
3
对于无符号整数而言,4GB的值是正确的。但如果你使用有符号整数,显然需要将其除以2才能得到可能的最大值。 - SwissCoder
据我所知,在 Windows 32 位系统中它是 3GB。不确定原因! - atoMerz
3
32位系统中有2GB的内存空间为用户进程保留,另外2GB则为内核保留。可以进行配置,使得内核只保留1GB的空间。 - Rune
@atoMerz:你可能只有一张1GB的显卡,这样就只剩下3GB的普通内存了。 - Nelson Rothermel

15

假设使用.NET -

Console.WriteLine(Int32.MaxValue);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接