我总是记不住电话号码。我需要一个记忆规则。


当前回答

一般来说,你可以做一个简单的操作,它反映了Int32的本质,用1填充所有可用的位-这是你可以很容易地保存在你的内存中的东西。它在大多数语言中的工作方式基本相同,但我以Python为例:

max = 0
bits = [1] * 31 # Generate a "bit array" filled with 1's
for bit in bits:
    max = (max << 1) | bit
# max is now 2147483647

对于unsigned Int32,将其设置为32而不是31个1。

但因为有一些更冒险的方法,我开始考虑公式,只是为了好玩…

公式1(如果没有给出运算符,则将数字连在一起)

a = 4 b = 8 巴/ a ab-1 接 ab-a-b ab-1

Python quickcheck

a = 4
b = 8
ab = int('%d%d' % (a, b))
ba = int('%d%d' % (b, a))
'%d%d%d%d%d' % (ba/a, ab-1, ab, ab-a-b, ab-1)
# gives '2147483647'

公式2

X = 48 x / 2 - 3 x - 1 x x * 3/4 x - 1

Python quickcheck

x = 48
'%d%d%d%d%d' % (x/2-3, x-1, x, x*3/4, x-1) 
# gives '2147483647'

其他回答

32位,1位符号,31位信息

2^31 - 1 = 2147483647

为什么1 ? 因为第一个是0,所以最大的是count - 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

首先写出两次47(你喜欢47号特工,对吧?),保持如图所示的空格(每个破折号是一个数字的槽位。先2个,然后4个)

--47----47

认为你手里有12个(因为12 =一打)。将其乘以4,47号特工号的第一位数字,即47,并将结果放在你已经拥有的第一对的右边

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。

练习几次,你就会掌握窍门的!

对于整数,最简单的方法是使用十六进制,前提是没有类似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位或更多位的代码时

我能想到的最正确的答案是Int32.MaxValue。

随便找个计算器,在十六进制模式下输入“7FFFFFFF”,然后切换到十进制。

2147483647.