ฉันไม่รู้ว่าทำไมมันถึงอ้างถึงประเภทข้อมูลแบบยาวเป็น int
มันไม่ใช่. คุณควรเรียนรู้ที่จะเชื่อถือข้อความคอมไพเลอร์ (โดยเฉพาะอย่างยิ่งเมื่อมาจากคอมไพเลอร์ที่มีสติทันสมัยและไม่ใช่คอมไพเลอร์ C / C ++ แบบโบราณ) แม้ว่าบางครั้งภาษาที่พวกเขาพูดอาจจะยากที่จะถอดรหัส แต่ก็มักจะไม่โกหกคุณ
ลองดูอีกครั้ง:
ลิเทอรัลของ int 9223372036854775807 อยู่นอกช่วง
โปรดทราบว่ามันไม่ได้กล่าวถึงตัวแปรtestLong
หรือประเภทของคุณlong
ที่ใดก็ได้ดังนั้นจึงไม่เกี่ยวกับการเริ่มต้น ปัญหาดูเหมือนจะเกิดขึ้นที่จุดอื่น
ตอนนี้ให้ตรวจสอบบางส่วนของข้อความ:
int
บอกเราว่าเขาต้องการที่จะรักษาบางสิ่งให้เป็นint
คุณค่า (ซึ่งไม่ใช่สิ่งที่คุณต้องการ!)
- "อยู่นอกช่วง" ค่อนข้างชัดเจน: มีบางอย่างไม่อยู่ในช่วงที่คาดไว้ (อาจเป็น
int
)
- "ตัวอักษร": ตอนนี้ที่น่าสนใจ: ตัวอักษรคืออะไร?
ฉันจะออกจากรายการสบาย ๆ เพื่อพูดคุยเกี่ยวกับตัวอักษรสักครู่: ตัวอักษรคือสถานที่ที่คุณมีค่าในรหัสของคุณ มีString
ตัวint
อักษรclass
ตัวอักษรตัวอักษรและอื่น ๆ ทุกครั้งที่คุณพูดถึงค่าอย่างชัดเจนในรหัสของคุณจะเป็นค่าตามตัวอักษร
ดังนั้นมันจึงไม่ได้จู้จี้คุณเกี่ยวกับการประกาศตัวแปร แต่เป็นตัวเลขเองค่าคือสิ่งที่ทำให้คุณจู้จี้
คุณสามารถตรวจสอบได้อย่างง่ายดายโดยใช้ลิเทอรัลเดียวกันในบริบทที่ a long
และ an int
เป็นที่ยอมรับอย่างเท่าเทียมกัน:
System.out.println(9223372036854775807);
PrintStream.println
สามารถใช้ทั้งanint
หรือalong
(หรืออย่างอื่นก็ได้) รหัสนั้นก็น่าจะใช้ได้ใช่ไหม?
เลขที่ดีบางทีมันควรจะเป็น แต่ตามกฎก็คือไม่ดี
ปัญหาคือว่า "ตัวเลขบางอย่าง" ที่ถูกกำหนดให้เป็นint
ตัวอักษรและดังนั้นจึงต้องint
อยู่ในช่วงที่กำหนดโดย
หากคุณต้องการเขียนlong
ตัวอักษรคุณต้องทำให้ชัดเจนโดยการต่อท้ายL
(หรือตัวพิมพ์เล็กl
แต่ฉันขอแนะนำให้คุณใช้ตัวแปรตัวพิมพ์ใหญ่เสมอเพราะอ่านง่ายกว่ามากและยากต่อการผิดพลาดสำหรับ a 1
)
โปรดทราบว่าปัญหาที่คล้ายกันนี้เกิดขึ้นกับfloat
(postfix F
/ f
) และdouble
(postfix D
/ d
)
หมายเหตุด้านข้าง: คุณจะทราบว่าไม่มีbyte
หรือตามshort
ตัวอักษรและคุณยังสามารถกำหนดค่า (โดยปกติจะเป็นint
ตัวอักษร) byte
และshort
ตัวแปรได้: ซึ่งเป็นไปได้เนื่องจากกฎพิเศษใน§ 5.2 เกี่ยวกับ Assignment Converson : อนุญาตให้กำหนดนิพจน์คงที่ในประเภทที่ใหญ่กว่า เพื่อbyte
, short
, char
หรือint
ถ้าค่าที่อยู่ในประเภทช่วง