ค่าสูงสุดสำหรับ int ใน PHP คือเท่าไร?


117

มองข้ามไลบรารีพิเศษที่อนุญาตให้คุณทำงานกับตัวเลขจำนวนมากค่า int ที่ใหญ่ที่สุดที่คุณสามารถจัดเก็บใน PHP คือเท่าใด

คำตอบ:


124

จากคู่มือ PHP :

ขนาดของจำนวนเต็มขึ้นอยู่กับแพลตฟอร์มแม้ว่าค่าสูงสุดประมาณสองพันล้านจะเป็นค่าปกติ (นั่นคือ 32 บิตที่เซ็นชื่อ) PHP ไม่รองรับจำนวนเต็มที่ไม่ได้ลงชื่อ ขนาดจำนวนเต็มสามารถกำหนดได้โดยใช้ PHP_INT_SIZE คงที่และค่าสูงสุดโดยใช้ PHP_INT_MAX คงที่ตั้งแต่ PHP 4.4.0 และ PHP 5.0.5

แพลตฟอร์ม 64 บิตมักมีค่าสูงสุดประมาณ 9E18 ยกเว้นใน Windows ก่อน PHP 7 ซึ่งเป็น 32 บิตเสมอ


15
บน amd64 linux ซึ่งเป็นเรื่องธรรมดาในปัจจุบัน 9223372036854775807 (2 ^ 63-1)
derobert

4
นั่นเป็นตัวเลขจำนวนมาก - มีเหตุผลแรกที่ฉันคิดว่าเคยเลือก AMD มากกว่า Intel เมื่อซื้อเซิร์ฟเวอร์เฉพาะ :)
karim79

39
@ karim79 ฉันคิดว่ามันเป็นเพราะ arch เป็น 64 บิตไม่ใช่ AMD =]
strager

7
AMD64 เป็นชื่อหนึ่งของสถาปัตยกรรม 64 บิตที่ทั้ง AMD และ Intel ใช้ในปัจจุบัน ชื่ออื่น ๆ ของมัน ได้แก่ x64 และ Intel 64 ตามที่ strager บอกไม่มีอะไรเกี่ยวข้องกับการเป็น AMD
thomasrutter

4
Windows XAMPP ของฉัน echo ของ 2147483647 ฉันมี AMD Athlon X2
Vova Popov

86

PHP รุ่น 32 บิต:

  • จำนวนเต็มได้ตั้งแต่-2,147,483,648ถึง2,147,483,647 (~ ± 2 พันล้าน)

PHP รุ่น 64 บิต:

  • จำนวนเต็มได้ตั้งแต่-9,223,372,036,854,775,808ถึง9,223,372,036,854,775,807 (~ ± 9 quintillion)

รวมตัวเลขแล้ว

หมายเหตุ: บิวด์ 64 บิตบางตัวเคยใช้จำนวนเต็ม 32 บิตโดยเฉพาะ Windows รุ่นเก่าที่สร้าง PHP

ค่านอกช่วงเหล่านี้จะแสดงด้วยค่าทศนิยมเช่นเดียวกับค่าที่ไม่ใช่จำนวนเต็มภายในช่วงเหล่านี้ ล่ามจะกำหนดโดยอัตโนมัติว่าการเปลี่ยนไปยังจุดลอยตัวนี้จะต้องเกิดขึ้นเมื่อใดโดยขึ้นอยู่กับว่าค่าผลลัพธ์ของการคำนวณไม่สามารถแสดงเป็นจำนวนเต็มได้

PHP ไม่รองรับจำนวนเต็ม "ไม่ได้ลงนาม" ดังนั้นจึง จำกัด ค่าสูงสุดของจำนวนเต็มทั้งหมดไว้ที่ช่วงของจำนวนเต็ม "ลงนาม"


1
ที่น่าสนใจใน 32 บิตสร้างลอยสามารถรักษาความถูกต้องเพื่อจำนวนเต็มค่าสูงกว่า ints - ลอยสามารถใช้สำหรับค่าจำนวนเต็มถึง 2 ^ 53 + 1, อย่างมีนัยสำคัญสูงกว่า 2 ^ 31-1 ของ ints ในบิวด์ 64 บิตสิ่งนี้จะกลับด้านเนื่องจากการลอยมีความแม่นยำเท่ากัน แต่ตอนนี้ ints สูงถึง 2 ^ 63 - 1
thomasrutter

21

ขนาดของ PHP ints ขึ้นอยู่กับแพลตฟอร์ม :

ขนาดของจำนวนเต็มขึ้นอยู่กับแพลตฟอร์มแม้ว่าค่าสูงสุดประมาณสองพันล้านจะเป็นค่าปกติ (นั่นคือ 32 บิตที่เซ็นชื่อ) PHP ไม่รองรับจำนวนเต็มที่ไม่ได้ลงชื่อ ขนาดจำนวนเต็มสามารถกำหนดได้โดยใช้ PHP_INT_SIZE คงที่และค่าสูงสุดโดยใช้ PHP_INT_MAX คงที่ตั้งแต่ PHP 4.4.0 และ PHP 5.0.5

PHP 6 เพิ่ม "longs" (ints 64 บิต)


2
ฉันไม่ได้รับการโหวตลงคะแนนเหล่านี้ .. นี่เป็นคำตอบที่ดีอย่างสมบูรณ์แบบแม้ว่าจะมีข้อมูลเพิ่มเติมบางอย่างก็ตาม +1 เพื่อแก้ไข
nickf

3
คำตอบนี้เดิมอ่านว่า "แพลตฟอร์มในการพึ่งพา" (ไม่ขึ้นกับ) นอกจากนี้ยัง (ยัง) อ้างว่าไม่มี ints 64 บิตก่อน PHP 6 ซึ่งเป็นเท็จ
thomasrutter

PHP 6 ไม่เคยเกิดขึ้นดังนั้นจึงไม่เกี่ยวข้อง
BadHorsie

16

(ช้าไปหน่อย แต่อาจมีประโยชน์)

เชื่อถือเฉพาะPHP_INT_MAX และ PHP_INT_SIZEค่านี้จะแตกต่างกันไปตาม arch ของคุณ (32/64 บิต) และระบบปฏิบัติการของคุณ ...

"เดา" หรือ "คำใบ้" อื่น ๆ อาจเป็นเท็จได้


6

ฉันพบแล้ว: 2 32 - 1 (2147483647)

http://au2.php.net/int

จำนวนเต็มล้น

หาก PHP พบตัวเลขเกินขอบเขตของประเภทจำนวนเต็มจะถูกตีความเป็นจำนวนลอยแทน นอกจากนี้การดำเนินการที่ให้ผลลัพธ์เป็นตัวเลขที่เกินขอบเขตของประเภทจำนวนเต็มจะส่งกลับค่าลอยแทน

<?php
$large_number =  2147483647;
var_dump($large_number);
// output: int(2147483647)

$large_number =  2147483648;
var_dump($large_number);
// output: float(2147483648)

8
นี่คือสิ่งที่จะเป็นบนแพลตฟอร์ม 32 บิต พิจารณาด้วยว่าผู้คนจำนวนมากใช้เซิร์ฟเวอร์บนแพลตฟอร์ม 64 บิต
thomasrutter

2

มันขึ้นอยู่กับระบบปฏิบัติการของคุณ แต่ 2147483647 เป็นค่าปกติตามคู่มือ


6
โดยเฉพาะขึ้นอยู่กับว่าคุณใช้งานบนแพลตฟอร์ม 32 บิตหรือ 64 บิต 32 บิตเป็นเพียง "ปกติ" ในโลกที่คนส่วนใหญ่ใช้เซิร์ฟเวอร์ 32 บิต สิ่งนี้จะไม่เป็นเช่นนั้นมากขึ้น
thomasrutter

0

แม้ว่าPHP_INT_*ค่าคงที่จะมีอยู่เป็นเวลานาน แต่ค่า MIN / MAX เดียวกันนี้สามารถพบได้โดยการเลื่อนไปทางซ้ายจนกว่าจะถึงจำนวนลบ:

$x = 1;
while ($x > 0 && $x <<= 1);
echo "MIN: ", $x;
echo PHP_EOL;
echo "MAX: ", ~$x;

0

มันขึ้นอยู่กับสถาปัตยกรรมของเซิร์ฟเวอร์ที่ PHP ทำงาน สำหรับ 64 บิต

print PHP_INT_MIN . ", ” . PHP_INT_MAX; อัตราผลตอบแทน -9223372036854775808, 9223372036854775807

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.