ฉันไม่รู้ว่าทำไมมันถึงอ้างถึงประเภทข้อมูลแบบยาวเป็น 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 ถ้าค่าที่อยู่ในประเภทช่วง