ค่าสูงสุดของจำนวนเต็ม


291

ใน C จำนวนเต็ม (สำหรับเครื่อง 32 บิต) คือ 32 บิตและมีค่าตั้งแต่ -32,768 ถึง +32,767 ใน Java ค่าจำนวนเต็ม (ยาว) ก็มี 32 บิต แต่มีค่าตั้งแต่ -2,147,483,648 ถึง +2,147,483,647

ฉันไม่เข้าใจว่าช่วงแตกต่างใน Java ได้อย่างไรแม้ว่าจำนวนบิตจะเท่ากัน มีคนอธิบายเรื่องนี้ได้ไหม


35
ในการรับค่าสูงสุดและต่ำสุดของ int ใน Java ให้ใช้ Integer.MAX_VALUE และ Integer.MIN_VALUE
ไลฟ์

5
@stackuser - บางคำตอบที่ดีสำหรับคำถามของคุณ - คุณควรจะยอมรับหนึ่ง :)
Darragh Enright

2
@DarraghEnright เขาเห็นครั้งสุดท้ายในเดือนมีนาคม 2558 ฉันสงสัยว่าเขาจะกลับมา :(
Ungeheuer

4
@ เอเดรียฮ่าฮ่า - ฉันเดาไม่ได้! ฉันคิดว่าเกิดขึ้นเล็กน้อย ฉันมักจะจินตนาการว่า SO สามารถยอมรับคำตอบอัตโนมัติได้อย่างง่ายดายภายใต้เงื่อนไขบางประการ - เมื่อคำถามมีอายุเกินกว่ากำหนด OP คือ AWOL และมีคำตอบที่เป็นประโยชน์อย่างชัดเจนกับจำนวน upvotes ที่สูง
Darragh Enright

2
@DarraghEnright เห็นด้วย แต่ OP อยู่ที่นี่ ~ 2 สัปดาห์ก่อนเขามีโอกาสที่จะยอมรับ
gaborsch

คำตอบ:


394

ในC ,ภาษาที่ตัวเองไม่ได้ตรวจสอบการเป็นตัวแทนของประเภทข้อมูลบางอย่าง มันอาจแตกต่างจากเครื่องหนึ่งไปอีกเครื่องหนึ่งในระบบฝังตัวintนั้นจะมีความกว้าง 16 บิต แต่โดยทั่วไปแล้วจะเป็น 32 บิต

ข้อกำหนดเพียงอย่างเดียวคือshort int<= int<= long intตามขนาด นอกจากนี้ยังมีข้อเสนอแนะว่าควรจะเป็นตัวแทนความจุพื้นเมืองของโปรเซสเซอร์int

ทุกประเภทมีการเซ็นชื่อ unsignedปรับปรุงช่วยให้คุณใช้บิตสูงสุดเป็นส่วนหนึ่งของค่า (มิฉะนั้นจะถูกสงวนไว้สำหรับบิตเครื่องหมาย)

นี่เป็นตารางสั้น ๆ ของค่าที่เป็นไปได้สำหรับประเภทข้อมูลที่เป็นไปได้:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

ในJava , Java Language ข้อกำหนดกำหนดเป็นตัวแทนของประเภทข้อมูล

ลำดับคือ: byte8 bits, short16 bits, int32 bits, long64 bits ประเภททั้งหมดเหล่านี้มีการลงชื่อไม่มีรุ่นที่ไม่ได้ลงนาม อย่างไรก็ตามการจัดการบิตจัดการกับตัวเลขตามที่ไม่ได้ลงชื่อ (นั่นคือจัดการบิตทั้งหมดอย่างถูกต้อง)

ชนิดข้อมูลอักขระcharมีความกว้าง 16 บิตไม่ได้ลงชื่อและเก็บอักขระโดยใช้การเข้ารหัส UTF-16 (อย่างไรก็ตามสามารถกำหนดcharจำนวนเต็ม 16 บิตที่ไม่ได้ลงชื่อโดยไม่ได้ตั้งใจซึ่งแสดงถึง codepoint อักขระที่ไม่ถูกต้อง)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

10
มาตรฐาน C ยังระบุค่าต่ำสุดสำหรับ INT_MAX, LONG_MAX, ฯลฯ
Oliver Charlesworth

13
Java 8 ตอนนี้มี Integer ที่ไม่ได้ลงนามเช่นกัน: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski

4
ขอบคุณ @jkbkot ดีที่รู้ว่า แม้ว่ามันจะดูเหมือนว่าการเป็นตัวแทนยังคงมีการลงนาม แต่การดำเนินงานที่ไม่ได้ลงนามบางอย่างจะถูกนำมาใช้เป็นฟังก์ชั่น มันยากที่จะเพิ่มสองที่ไม่ได้ลงชื่อints ...
gaborsch

5
@GaborSch ใน Java การint foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));พิมพ์2147483648และcharเป็นประเภทที่ไม่ได้ลงนาม
howlger

2
@howlger Integer.MAX_VALUE + 1อยู่0x80000000ในรูปแบบเลขฐานสิบหกเนื่องจากมีค่ามากเกิน (และเท่ากับInteger.MIN_VALUE) ถ้าคุณแปลงเป็นไม่ได้ลงนาม (ยาว) 2147483648บิตเครื่องหมายจะได้รับการปฏิบัติเช่นบิตค่าดังนั้นมันจะเป็น ขอบคุณสำหรับcharบันทึก charไม่ถูกต้องคุณไม่ถูกต้อง แต่ถ่านไม่ได้ใช้สำหรับการคำนวณจริงๆนั่นคือสาเหตุที่ฉันทิ้งมันไว้จากรายการ
gaborsch

73

ใน C จำนวนเต็ม (สำหรับเครื่อง 32 บิต) คือ 32 บิตและอยู่ในช่วงตั้งแต่ -32768 ถึง +32767

ไม่ถูกต้อง. จำนวนเต็มที่ลงนาม 32- บิตในการเป็นตัวแทนของ 2 มีช่วง -2 31ถึง 2 31 -1 ซึ่งเท่ากับ -2,147,483,648 ถึง 2,147,483,647


3
ฉันแก้ไขการยกกำลังของคุณ**ไม่ใช่แม้แต่ C และไม่ชัดเจนในความคิดของฉัน :)
คลาย

2
ดูดีขึ้นตอนนี้ขอบคุณ! Python มากเกินไปฉันคิดว่า ฉันหลีกเลี่ยง^เพราะปกติแล้วxor
คอส

5
ฉันคิดว่าประเด็นของฉันคือเนื่องจาก C ไม่มีตัวดำเนินการยกกำลังฉันไม่คิดว่าชิ้นส่วนเฉพาะควรจัดรูปแบบเป็นรหัสเลย :)
คลาย

19

จำนวนเต็ม 32 บิตมีช่วงตั้งแต่ -2,147,483,648 ถึง 2,147,483,647 อย่างไรก็ตามความจริงที่ว่าคุณอยู่ในเครื่อง 32- บิตไม่ได้หมายความว่าCคอมไพเลอร์ของคุณใช้จำนวนเต็ม 32- บิต


1
อย่างน้อยสำเนา Mr. Kernighan และ Mr. Ritchies "ภาษาการเขียนโปรแกรม C" กล่าวใน A4.2 นั่นintคือ "ความกว้างตามธรรมชาติของเครื่อง" ซึ่งฉันตีความว่าเป็น 32 บิตเมื่อรวบรวมสำหรับเครื่อง 32 บิต
Junix

7
ขึ้นอยู่กับคอมไพเลอร์ไม่ใช่เครื่องที่ฉันเชื่อ ฉันมีคอมไพเลอร์ 16 บิตติดตั้งบนเครื่อง 64 บิตของฉัน
Ivaylo Strandjev

แน่นอนว่าคอมไพเลอร์ 16 บิตของคุณสำหรับรหัส x86 16 บิตนั้นใช้เพียง 16 บิตเท่านั้น แต่นั่นไม่ใช่จุดของฉัน แม้แต่โปรเซสเซอร์ 32 บิต x86 ที่ทำงานในโหมด 16 บิตมีเพียงความจุดั้งเดิมเท่านั้น 16 บิต ประเด็นของฉันคือแพลตฟอร์มเป้าหมายที่คอมไพเลอร์มีความสำคัญ เช่นถ้าคุณมีคอมไพเลอร์สำหรับ 80286 ของคุณคุณจะยังคงสร้างรหัส 16 บิตและดังนั้นจึงมีจำนวนเต็ม 16 บิต
Junix

2
@ Junix ฉันเชื่อว่านั่นคือสิ่งที่ฉันชี้ให้เห็นในคำตอบของฉัน ไม่ใช่ระบบปฏิบัติการที่ระบุจำนวนบิตของจำนวนเต็มของคุณ แพลตฟอร์มเป้าหมายเป็นคุณสมบัติของคอมไพเลอร์ไม่ใช่ระบบปฏิบัติการที่ทำงานหรือโปรเซสเซอร์ที่คุณมี
Ivaylo Strandjev

ตามที่ฉันเขียนไว้ในความคิดเห็นแรกของฉัน "เป็น 32 บิตเมื่อรวบรวมสำหรับเครื่อง 32 บิต" OP เขียนในการโพสต์ของเขา "จำนวนเต็ม (สำหรับเครื่อง 32 บิต)" ดังนั้นจากสิ่งที่ฉันเข้าใจว่าเขาไม่ได้อ้างถึงระบบปฏิบัติการของเขาหรือเครื่องของเขาเขาอ้างถึงแพลตฟอร์มเป้าหมายของเขา
Junix

15

คำจำกัดความภาษา C ระบุช่วงต่ำสุดสำหรับชนิดข้อมูลต่างๆ สำหรับintช่วงต่ำสุดนี้คือ -32767 ถึง 32767 หมายถึงintต้องมีความกว้างอย่างน้อย 16 บิต การใช้งานฟรีเพื่อให้intประเภทที่กว้างขึ้นด้วยช่วงกว้างที่สอดคล้องกัน ตัวอย่างเช่นบนเซิร์ฟเวอร์การพัฒนา SLES 10 ที่ฉันทำงานอยู่ช่วงคือ -2147483647 ถึง 2137483647

ยังคงมีบางระบบออกมีที่ใช้ 16 บิตintชนิด (All The World Is Not VAX x86) แต่มีปริมาณมากว่าการใช้งานแบบ 32 บิตintประเภทและอาจจะไม่กี่ที่ใช้ 64 บิต

ภาษา C ได้รับการออกแบบให้ทำงานบนสถาปัตยกรรมที่แตกต่างกัน Java ถูกออกแบบมาเพื่อทำงานในเครื่องเสมือนที่ซ่อนความแตกต่างทางสถาปัตยกรรมเหล่านั้น


สำหรับ int 16- บิตมันคือ -3276 8ถึง 32767 สำหรับ int 32- บิตมันคือ -214748364 8ถึง 2147483647 ช่วงที่ระบุตั้งแต่ -2 ^ (n bits-1) ถึง + 2 ^ (n bits-1 ) - 1.
mythicalcoder

3
@Maven: 5.2.4.2.1 - มีการระบุเป็นINT_MIN -32767อย่าถือว่าส่วนเติมเต็มของทั้งสอง
John Bode

8

เทียบเท่าที่เข้มงวดของจาวาintคือlong intใน C.

แก้ไข: หากint32_tกำหนดไว้จะมีค่าเทียบเท่าในแง่ของความแม่นยำ long intรับประกันความแม่นยำของจาวาintเพราะรับประกันว่ามีขนาดอย่างน้อย 32 บิต


คุณพูดถูกก็เท่ากับint32_tว่ามันถูกกำหนดโดยคอมไพเลอร์ของคุณ
UmNyobe

7

นั่นเป็นเพราะใน C - จำนวนเต็มบนเครื่อง 32 บิตไม่ได้หมายความว่าใช้ 32 บิตในการจัดเก็บมันอาจเป็น 16 บิตเช่นกัน มันขึ้นอยู่กับเครื่อง (ขึ้นอยู่กับการใช้งาน)


1
ดีก็เป็นที่น่าสังเกตว่าพฤติกรรมการใช้งานโดยทั่วไปคือการใช้ "ความกว้างของเครื่อง" intสำหรับ แต่limits.hช่วยค้นหาว่าอะไรคือความจริงที่แน่นอน
Junix

3
แต่ในความเป็นจริงฉันไม่คิดว่าคอมไพเลอร์ C สำหรับ 32 ได้ทำโดยไม่ต้อง int เป็น 32 บิต มาตรฐานอาจอนุญาตให้คอมไพเลอร์ใช้งาน int ให้มีลักษณะเป็น moronic แต่ด้วยเหตุผลบางอย่างไม่มีใครต้องการสร้างคอมไพเลอร์ moronic C แนวโน้มคือการทำให้คอมไพเลอร์ C มีประโยชน์
Lundin


4

ที่จริงขนาดในบิตของint, short, long ขึ้นอยู่กับการดำเนินการคอมไพเลอร์

เช่นบน Ubuntu ของฉัน 64 บิตฉันมีshortใน32บิตเมื่ออีกหนึ่งรุ่น 32bit อูบุนตูมันเป็น16บิต


1

ในช่วง C สำหรับ __int32 คือ –2147483648 ถึง 2147483647 ดูที่นี่สำหรับช่วงเต็ม

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

ไม่มีการรับประกันว่า 'int' จะเป็น 32 บิตหากคุณต้องการใช้ตัวแปรที่มีขนาดเฉพาะโดยเฉพาะอย่างยิ่งเมื่อเขียนโค้ดที่เกี่ยวข้องกับการปรับเปลี่ยนบิตคุณควรใช้ 'Standard Integer Types'

ในภาษาจาวา

ชนิดข้อมูล int เป็นเลขจำนวนเต็มเสริมสองตัวของ 32 บิตที่เซ็นชื่อ มีค่าต่ำสุด -2,147,483,648 และค่าสูงสุดคือ 2,147,483,647 (รวม)


2
ค่าที่คุณอ้างอิงสำหรับ C เป็นเพียงช่วงต่ำสุดเท่านั้น
Oliver Charlesworth

@OliCharlesworth ช่วงถ้าจากต่ำสุดไปสูงสุด
Achintya Jha

6
สิ่งที่ฉันหมายถึงคือช่วงสำหรับแต่ละประเภทจะได้รับอนุญาตให้มีขนาดใหญ่กว่าสิ่งที่คุณเสนอไว้ข้างต้น
Oliver Charlesworth

3
ไม่มีสิ่งใดใน C ที่เรียกว่า __int32 Microsoft ไม่มีคอมไพเลอร์ C ที่เคร่งครัดดังนั้นใครสนใจว่าคอมไพเลอร์ที่ไม่ใช่ C ทำงานอย่างไร แหล่งข้อมูลที่เกี่ยวข้องเพียงอย่างเดียวคือ ISO9899 ทั้ง 5.2.4.2.1 "ขนาดของประเภทจำนวนเต็ม" หรือ 7.20.2.1 "ข้อ จำกัด ของประเภทจำนวนเต็มความกว้างที่แน่นอน" ไม่มีสิ่งใดที่เข้ากันได้กับ Microsoft goo
Lundin

2
C99 เพิ่ม int32_t, int16_t และอื่น ๆ ให้กับมาตรฐาน ไม่สามารถใช้งานร่วมกับส่วนเพิ่มเติมของ Microsoft ได้ 100% แต่ทำงานได้ในลักษณะเดียวกัน
ถามเกี่ยวกับโมนิก้า

1

จริงๆแล้วมันเป็นเรื่องง่ายที่จะเข้าใจคุณสามารถคำนวณได้ด้วยเครื่องคิดเลข google: คุณมี 32 บิตสำหรับคอมพิวเตอร์ int และเป็นเลขฐานสองดังนั้นคุณสามารถมี 2 ค่าต่อบิต (จุด) ถ้าคุณคำนวณ 2 ^ 32 คุณจะได้ 4,294,967,296 ดังนั้นถ้าคุณหารจำนวนนี้ด้วย 2 (เพราะครึ่งหนึ่งเป็นจำนวนเต็มลบและอีกครึ่งเป็นบวก) ดังนั้นคุณจะได้ 2,147,483,648 และจำนวนนี้เป็น int ที่ใหญ่ที่สุดที่สามารถแสดงด้วย 32 บิตแม้ว่าคุณจะต้องใส่ใจคุณจะสังเกตเห็นว่า 2,147,483,648 มากกว่า 2,147,483,647 โดย 1 นี่เป็นเพราะตัวเลขตัวใดตัวหนึ่งแทน 0 ซึ่งอยู่ตรงกลางน่าเสียดายที่ 2 ^ 32 ไม่ใช่เลขคี่ดังนั้นคุณไม่มีตรงกลางหมายเลขเดียวดังนั้นเลขจำนวนเต็มจะมีเลขศูนย์น้อยลงหนึ่งตัวขณะที่ค่าลบมีครึ่งสมบูรณ์ 2,147,483,648

และนั่นมัน ขึ้นอยู่กับเครื่องที่ไม่ใช้ภาษา


2
นี่ไม่ใช่สิ่งที่เขาถาม ... คำถามคือ "ทำไม C int แตกต่างจาก Java int?"
ElectronWill

และใน Java ขนาดของint ไม่ขึ้นอยู่กับเครื่อง int== 32 บิตลงนาม two's-สมบูรณ์จะถูกกำหนดโดยสเปคภาษา Java และแกะสลักบนแผ่น anodized Unobtainium (ตกลงอาจไม่ใช่บิตสุดท้าย)
Stephen C

-1

ในมาตรฐาน C คุณสามารถใช้ INT_MAX เป็นค่าสูงสุด 'int' ค่าคงที่นี้ต้องถูกกำหนดใน "limits.h" ค่าคงที่ที่คล้ายกันจะถูกกำหนดสำหรับประเภทอื่น ๆ ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ) ตามที่ระบุค่าคงที่เหล่านี้ขึ้นอยู่กับการใช้งาน แต่มีค่าต่ำสุดตามบิตขั้นต่ำ สำหรับแต่ละประเภทตามที่ระบุในมาตรฐาน


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