การตั้งค่า Short Value Java


114

ฉันกำลังเขียนโค้ดเล็ก ๆ น้อย ๆ ใน J2ME setTableId(Short tableId)ฉันได้เรียนด้วยวิธีการที่ ตอนนี้เมื่อฉันพยายามที่จะเขียนsetTableId(100)มันทำให้เกิดข้อผิดพลาดเวลาคอมไพล์ ฉันจะตั้งค่า short โดยไม่ต้องประกาศตัวแปร short อื่นได้อย่างไร

เมื่อตั้งLongค่าฉันสามารถใช้setLongValue(100L)และใช้งานได้ ที่Lนี่หมายความว่าอย่างไรและมีไว้เพื่ออะไรShortค่าคืออะไร?

ขอบคุณ


Lเป็นเพียงคำต่อท้ายที่ใช้เพื่อระบุlongตัวอักษร
missingfaktor

คำตอบ:


174

ใน Java ลิเทอรัลจำนวนเต็มเป็นประเภท int โดยค่าเริ่มต้น ประเภทอื่น ๆ บางอย่างที่คุณอาจจะต่อท้ายที่แท้จริงด้วยตัวอักษรกรณีตายเหมือนL, D, Fเพื่อระบุยาวคู่หรือลอยตามลำดับ โปรดทราบว่าเป็นเรื่องธรรมดาที่จะใช้ตัวอักษรตัวพิมพ์ใหญ่เพื่อให้อ่านง่ายขึ้น

ข้อกำหนดภาษา Java ไม่ได้ให้น้ำตาลเชิงไวยากรณ์เดียวกันสำหรับไบต์หรือชนิดสั้น แต่คุณอาจประกาศโดยใช้การแคสต์อย่างชัดเจน:

byte foo = (byte)0;
short bar = (short)0;

ในsetLongValue(100L)การเรียกเมธอดของคุณคุณไม่จำเป็นต้องใส่Lคำต่อท้ายเพราะในกรณีนี้ int literal จะถูกขยายเป็น long โดยอัตโนมัติ สิ่งนี้เรียกว่าการขยายการแปลงแบบดั้งเดิมในข้อกำหนดภาษา Java


16
มีคำต่อท้ายสำหรับประเภทอื่นด้วย: d/ Dทำให้ a doubleและf/ Fทำให้ลอย!
Joachim Sauer

6
นอกจากนี้: ตัวอักษรที่มีขนาดพอดีไม่จำเป็นต้องหล่อ: ตัวอย่างทั้งสองของคุณใช้งานได้โดยไม่ต้องใช้นักแสดงเช่นกัน
Joachim Sauer

คุณมีสิทธิ์ทั้งสองอย่าง ฉันควรจะชัดเจนมากขึ้นว่าฉันกำลังพูดถึงตัวอักษรจำนวนเต็มที่นี่ไม่ใช่เรื่องทศนิยม
Lauri

4
@ Joachim: ไม่จำเป็นต้องใช้นักแสดงสำหรับ J5 + เท่านั้น น่าเสียดายที่ J2ME ยังคงอยู่ที่ J4 (J4 ที่ถูกโค่นลงอย่างจริงจัง)
Lawrence Dol

2
@JoachimSauer "พอดีกับขนาด" หมายความว่าอย่างไร ฉันขอเพราะฉันเพิ่งมีการโยนโดยเฉพาะ0ในฐานะ(short)0ที่จะได้รับรอบpossible lossy conversion from int to shortข้อผิดพลาดแม้ว่า 0 เป็นระยะสั้น
ryvantage

34

ไม่มีสิ่งที่เรียกว่าไบต์หรือลิเทอรัลสั้น ๆ คุณต้องร่ายให้สั้นโดยใช้(short)100


9

โดยทั่วไปคุณสามารถโยนตัวแปรให้กลายเป็นไฟล์short.

คุณอาจได้รับปัญหาเช่นนี้ซึ่งอาจทำให้สับสนได้ เนื่องจากตัว+ดำเนินการส่งเสริมให้เป็นไฟล์int

ใส่คำอธิบายภาพที่นี่

การแคสต์องค์ประกอบจะไม่ช่วย:

ใส่คำอธิบายภาพที่นี่

คุณต้องส่งนิพจน์:

ใส่คำอธิบายภาพที่นี่


1
อย่าลืมมีเหตุผลว่าทำไม short + short = int หากผลรวมของกางเกงขาสั้นสองตัวสูงกว่าค่าสั้นสูงสุดของเครื่องการร่ายให้สั้นอาจให้ผลลัพธ์ที่ไม่คาดคิดหรือทำให้เกิดข้อยกเว้นหากมีการสนับสนุนโดยเนกาเจ
DGoiko

2
ด้วยตรรกะนั้นการเพิ่มสอง ints จะกลับมายาวนาน)
matt burn

1
และฉันมองหาว่าหากผลรวมของฉันเกิน Integer.MAX_VALUE ฉันไม่ได้ปกป้องการตัดสินใจในการส่งคืน int (ซึ่งอาจเชื่อมโยงกับวิธีที่ HW ดำเนินการผลรวมจริง) ฉันแค่บอกว่าผู้คนควรยืนยันว่าผลลัพธ์นั้นเติมเต็มในช่วงสั้น ๆ ก่อนที่จะวางไว้ที่นั่น ฉันพบข้อบกพร่องในการกำหนดความจุสั้นมากกว่าการกำหนด int เช่นกันอาจเป็นเพราะขนาดของตัวเลขที่เกี่ยวข้อง ตัว
ต้านทาน

1
ฉันอ่านความคิดเห็นของฉันอีกครั้งและฉันไม่ได้ชี้ให้ชัดเจน ประโยคแรกสับสนและฉันไม่ควรพูดอย่างนั้นและปล่อยให้ส่วนที่เหลือดูเหมือนว่ามีสองคำที่เกี่ยวข้องกันเหตุผลเบื้องหลัง short + short เป็น int สามารถอ่านได้ที่นี่: docs.oracle.com/javase/specs/ jvms / se8 / html / …ไม่มีการดำเนินการ sum สำหรับ short ใน JVM int ของ Java คือ 32 บิตและเมื่อมีการแยกส่วนนี้คอมพิวเตอร์ส่วนใหญ่เป็น 32 บิตดังนั้นฉันจึงเดาว่า int ดูเหมือนจะเป็นความคิดที่ดีที่สุด
DGoiko

1
โปรดทราบว่าตามที่อธิบายไว้ที่นี่stackoverflow.com/a/27123302/9465588 JVM ทำเซิร์ฟเวอร์จริงอย่างน้อย 32 บิตของพื้นที่หน่วยความจำเสมือนต่อฟิลด์คลาสดังนั้นการประกาศฟิลด์สั้นจึงไม่ช่วยประหยัดหน่วยความจำเลย ฉันไม่รู้ว่า Java เปลี่ยนสิ่งนี้หรือไม่ ฉันมักจะไม่ใช้ค่าสั้น ๆ เว้นแต่จะมีข้อ จำกัด ภายนอกที่เกี่ยวข้องเช่นใน DAO
DGoiko

8

คุณสามารถใช้setTableId((short)100). ฉันคิดว่าสิ่งนี้มีการเปลี่ยนแปลงใน Java 5 เพื่อให้ตัวอักษรตัวเลขที่กำหนดให้เป็นไบต์หรือสั้นและอยู่ในช่วงสำหรับเป้าหมายจะถือว่าเป็นประเภทเป้าหมายโดยอัตโนมัติ J2ME JVMs ล่าสุดนั้นมาจาก Java 4


PS: ยินดีต้อนรับสู่ความเจ็บปวดในวัยกลางคนจากการเขียนโค้ดสำหรับ J2ME แทบรอไม่ไหวแล้วสำหรับอุปกรณ์มือถือที่สามารถใช้งานเดสก์ท็อปได้ถึงปี 2000
Lawrence Dol

3
ไม่มี "J4" (และไม่มี "J5" โปรดอย่าทำให้รูปแบบการกำหนดเวอร์ชัน / การตั้งชื่อ Java สับสนไปกว่าที่เป็นอยู่แล้ว
Joachim Sauer

2
@ Joachim: Java 1, Java 2, Java 5, Java 6 และ Java 7 เป็นที่รู้จักกันดีและมีการอ้างถึง ไม่ยากเกินไปที่จะคาดเดาว่า Java 3 และ Java 4 หมายถึงอะไร "Jn" เป็นเพียงตัวย่อของสิ่งที่ชัดเจน การใช้ระบบการตั้งชื่อปัจจุบันของ Sun (และหวังว่าจะเป็นที่สิ้นสุด) สำหรับทุกเวอร์ชันช่วยลดความสับสน
Lawrence Dol

2
@ โจอาคิม: ตามคำพูดสุดท้ายของซันในหัวข้อ "1. " ที่นำหน้า ของ Java "1.x" จะได้รับการปฏิบัติราวกับว่าไม่เคยมีมาก่อนเมื่ออ้างถึงเวอร์ชันในการสนทนาและจะถูกเก็บรักษาไว้ในเวอร์ชันที่ JVM ปล่อยออกมาเพื่อความเข้ากันได้เท่านั้น ดังนั้น Java 2 จึงเป็นเวอร์ชันที่ก่อนหน้านี้รู้จักกันในชื่อ 1.2 จากที่ J2SE มา แต่เดิม (คุณจะทราบว่าในขณะเดียวกัน Sun ก็ไม่แนะนำให้ใช้ J2xE อีกต่อไป แต่เป็น JavaEE, JavaSE และ JavaME) ตามมาด้วย 1.3 คือ Java 3, 1.4 คือ Java 4, 1.5 คือ Java 5, 1.6 คือ Java 6 และ 1.7 คือ Java 7 อย่างจริงจังนี่ไม่ใช่เรื่องยากที่จะให้เหตุผล
Lawrence Dol

2
ตัว "1. " ถูกเพียงตัดใน Java 5 และต่อมา Java 1.0-1.4 มักอ้างถึงชื่อนั้นโดย Sun และนั่นเป็นการกระทำโดยเจตนาเพราะ Sun ใช้ "Java 2" เพื่ออ้างถึง Java 1.2 ถึง Java 1.5 / Java 5 มันสับสนมาก แต่การประดิษฐ์ชื่อใหม่ที่ Sun ไม่เคยใช้ไม่ได้ทำให้ง่ายขึ้น
Joachim Sauer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.