1. การพิมพ์
ตัวแปรประเภทดั้งเดิม (ยกเว้นประเภทboolean
) ใช้เพื่อจัดเก็บตัวเลขประเภทต่างๆ แม้ว่าประเภทของตัวแปรจะไม่เคยเปลี่ยนแปลง แต่ก็มีที่ที่คุณสามารถแปลงจากประเภทหนึ่งไปเป็นอีกประเภทหนึ่งได้ และสถานที่นั้นคืองาน
สามารถกำหนดตัวแปรประเภทต่างๆ ให้กันได้ เมื่อคุณทำเช่นนี้ ค่าของตัวแปรประเภทหนึ่งจะถูกแปลงเป็นค่าของอีกประเภทหนึ่งและกำหนดให้กับตัวแปรตัวที่สอง ในเรื่องนี้ เราสามารถระบุการแปลงประเภทได้สองประเภท: การขยายและการทำให้แคบลง
การขยับขยายก็เหมือนกับการย้ายค่าจากตะกร้าใบเล็กไปยังตะกร้าใบใหญ่ การดำเนินการนี้ราบรื่นและไม่เจ็บปวด การทำให้แคบลงเกิดขึ้นเมื่อคุณย้ายค่าจากตะกร้าใบใหญ่ไปยังตะกร้าใบเล็ก: อาจมีพื้นที่ไม่เพียงพอ และคุณจะต้องทิ้งบางสิ่งไป
นี่คือประเภท เรียงตามขนาดตะกร้า:
2. การขยายประเภทการแปลง
บ่อยครั้งที่จำเป็นต้องกำหนดตัวแปรที่เป็นตัวเลขประเภทหนึ่งให้กับตัวแปรที่เป็นตัวเลขอีกประเภทหนึ่ง คุณทำอย่างนั้นได้อย่างไร?
Java มี 4 ประเภทจำนวนเต็ม:
พิมพ์ | ขนาด |
---|---|
byte |
1 byte |
short |
2 bytes |
int |
4 bytes |
long |
8 bytes |
ตัวแปรที่จัดเก็บไว้ในตะกร้าขนาดเล็กสามารถกำหนดให้กับตัวแปรที่จัดเก็บไว้ในตะกร้าขนาดใหญ่ได้เสมอ
int
และ กำหนด ตัวแปรให้กับตัวแปรshort
ได้byte
ง่าย และสามารถกำหนดตัวแปรให้กับตัวแปรได้ และสามารถกำหนดตัวแปรให้กับตัวแปรได้long
short
byte
int
byte
short
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
รหัสนี้จะรวบรวมได้ดี |
การแปลงดังกล่าว จากประเภทที่เล็กลงเป็นประเภทที่ใหญ่ขึ้น เรียกว่าการแปลงประเภทที่กว้างขึ้น
แล้วจำนวนจริงล่ะ?
เมื่อมีทุกอย่างเหมือนกัน ขนาดก็สำคัญ:
พิมพ์ | ขนาด |
---|---|
float |
4 bytes |
double |
8 bytes |
float
สามารถกำหนดตัวแปรให้กับdouble
ตัวแปรได้โดยไม่มีปัญหาใดๆ แต่สิ่งที่น่าสนใจกว่าคือประเภทจำนวนเต็ม
คุณสามารถกำหนดตัวแปรจำนวนเต็มให้กับfloat
ตัวแปร แม้แต่long
ประเภทที่มีความยาว 8 ไบต์ และคุณสามารถกำหนดสิ่งที่คุณต้องการ — ตัวแปรจำนวนเต็มหรือfloat
ตัวแปร — ให้กับdouble
ตัวแปร:
รหัส | บันทึก |
---|---|
|
|
โปรดทราบว่าการแปลงเป็นประเภทจริงอาจทำให้สูญเสียความแม่นยำเนื่องจากไม่มีตัวเลขที่มีนัยสำคัญเพียงพอ
เมื่อแปลงจากจำนวนเต็มเป็นตัวเลขทศนิยม ลำดับล่างของตัวเลขอาจถูกละทิ้ง แต่เนื่องจากเข้าใจว่าตัวเลขเศษส่วนเก็บค่าโดยประมาณ จึงอนุญาตให้ดำเนินการมอบหมายดังกล่าวได้
3. การแปลงประเภทที่แคบลง
แล้วความเป็นไปได้อื่นๆ ล่ะ? จะทำอย่างไรถ้าคุณต้องการกำหนดlong
ค่าให้กับint
ตัวแปร
ลองนึกภาพตัวแปรเป็นตะกร้า เรามีตะกร้าหลายขนาด: 1, 2, 4 และ 8 ไบต์ การย้ายแอปเปิ้ลจากตะกร้าใบเล็กไปยังตะกร้าใบใหญ่นั้นไม่ใช่ปัญหา แต่เมื่อเปลี่ยนจากตะกร้าที่ใหญ่ขึ้นเป็นตะกร้าที่เล็กลง แอปเปิ้ลบางส่วนอาจหายไป
การแปลงนี้ — จากประเภทที่ใหญ่ขึ้นเป็นประเภทที่เล็กลง – เรียกว่าการแปลงประเภทที่แคบลง เมื่อดำเนินการกำหนดเช่นนี้ ส่วนหนึ่งของตัวเลขอาจไม่พอดีกับตัวแปรใหม่และอาจถูกละทิ้ง
เมื่อจำกัดประเภทให้แคบลง เราต้องบอกคอมไพเลอร์อย่างชัดเจนว่าเราไม่ได้ทำผิดพลาด เราจงใจละทิ้งส่วนหนึ่งของตัวเลข ใช้ตัวดำเนินการ typecast สำหรับสิ่งนี้ เป็นชื่อประเภทในวงเล็บ
ในสถานการณ์เช่นนี้คอมไพเลอร์ Javaต้องการให้โปรแกรมเมอร์ระบุตัวดำเนินการ typecast โดยทั่วไปจะมีลักษณะดังนี้:
(type) expression
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
แต่ละครั้งต้องระบุตัวดำเนินการ typecast อย่างชัดเจน |
ที่นี่a
เท่ากับ1
และบางทีตัวดำเนินการ typecast ดูเหมือนจะเกินความจำเป็น แต่ถ้าa
ใหญ่กว่าล่ะ?
รหัส | คำอธิบาย |
---|---|
|
|
หนึ่งล้านพอดีกับ a long
และในint
. แต่เมื่อกำหนดหนึ่งล้านให้กับshort
ตัวแปร สองไบต์แรกจะถูกละทิ้ง และเหลือเพียงสองไบต์สุดท้ายเท่านั้น และเมื่อกำหนดให้ a byte
สิ่งเดียวที่เหลือคือไบต์สุดท้าย
วิธีจัดเรียงตัวเลขในหน่วยความจำ:
พิมพ์ | สัญกรณ์ไบนารี | เครื่องหมายทศนิยม |
---|---|---|
int |
0b 00000000 00001111 01000010 01000000 | 1000000 |
short |
0b 01000010 01000000 | 16.960 |
byte |
0บ01000000 | 64 |
char
พิมพ์
A char
เช่น a short
ใช้พื้นที่สองไบต์ แต่หากต้องการแปลงเป็นอีกอันหนึ่ง คุณต้องใช้ตัวดำเนินการ typecast เสมอ ปัญหาที่นี่คือshort
ประเภทมีการลงนามและสามารถมีค่าจากถึง-32,768
แต่+32,767
ประเภทchar
ไม่ได้ลงนามและสามารถมีค่าจาก0
ถึง65,535
ไม่สามารถเก็บจำนวนลบใน a แต่char
สามารถเก็บไว้ใน short
และshort
ไม่สามารถเก็บตัวเลขที่มากกว่า32,767
แต่สามารถเก็บตัวเลขดังกล่าวในchar
.
4. ประเภทของนิพจน์
จะเกิดอะไรขึ้นหากใช้ตัวแปรประเภทต่างๆ ในนิพจน์เดียวกัน ตามเหตุผลแล้ว เราเข้าใจว่าต้องแปลงเป็นประเภททั่วไปก่อน แต่ที่หนึ่ง?
สำหรับคนที่ใหญ่กว่าแน่นอน
Java จะแปลงเป็นประเภทที่ใหญ่กว่าเสมอ พูดอย่างคร่าว ๆ ว่าประเภทใดประเภทหนึ่งจะถูกขยายก่อน จากนั้นจึงดำเนินการโดยใช้ค่าประเภทเดียวกันเท่านั้น
ถ้า an int
และ a long
เกี่ยวข้องกับนิพจน์ ค่าของ the int
จะถูกแปลงเป็น a long
และจากนั้นการดำเนินการจะดำเนินการต่อ:
รหัส | คำอธิบาย |
---|---|
|
a จะขยายเป็น a long แล้วการบวกจะเกิดขึ้น |
ตัวเลขทศนิยม
หากจำนวนเต็มและเลขทศนิยม ( float
หรือdouble
) เกี่ยวข้องกับนิพจน์ จำนวนเต็มจะถูกแปลงเป็นเลขทศนิยม ( float
หรือdouble
) และจากนั้นจะดำเนินการเท่านั้น
หากการดำเนินการเกี่ยวข้องกับ a float
และ a double
การดำเนินการนั้นfloat
จะถูกแปลงเป็นdouble
a ซึ่งเป็นไปตามคาดจริงๆ
, , และประเภทจะถูกแปลงเป็นเสมอ เมื่อ byte
มีการโต้ตอบระหว่างกัน มีเหตุผลที่ดีว่าทำไมประเภทจึงถือเป็นประเภทจำนวนเต็มมาตรฐานshort
char
int
int
หากคุณคูณ a byte
ด้วย a คุณ จะshort
ได้ int
หากคุณคูณ a byte
ด้วย a คุณ จะbyte
ได้ int
แม้ว่าคุณจะเพิ่ม a byte
และ a คุณก็ จะbyte
ได้int
มีหลายสาเหตุนี้. ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
110 * 120 คือ13,200 ซึ่งมากกว่าค่าสูงสุดของbyte ประเภทเล็กน้อย:127 |
|
110 + 120 คือ230 ซึ่งมากกว่าค่าสูงสุดของbyte ประเภทเล็กน้อยด้วย:127 |
โดยทั่วไป เมื่อคูณเลข 8 บิต (1 ไบต์) ด้วยเลข 8 บิต (1 ไบต์) เราจะได้ตัวเลขที่ใช้พื้นที่บิต 16 บิต (2 ไบต์)
ด้วยเหตุนี้ การดำเนินการทั้งหมดที่มีประเภทจำนวนเต็มที่น้อยกว่า จะถูกแปลงเป็น s int
ทันที int
และนั่นหมายความว่าหากคุณต้องการเก็บผลลัพธ์ของการคำนวณไว้ในตัวแปรประเภทที่เล็กกว่าint
คุณจะต้องระบุตัวดำเนินการ typecast อย่างชัดเจนเสมอ
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
นิพจน์byte * byte จะเป็นint |
|
นิพจน์byte + byte จะเป็นint |
|
นิพจน์byte + int จะเป็น an int ตัวอักษรคือ int an |
5. ความแตกต่างที่สำคัญ
ตัวดำเนินการ typecast มีลำดับความสำคัญค่อนข้างสูง
ซึ่งหมายความว่าหากนิพจน์ประกอบด้วย ตัวอย่างเช่น การบวกและตัวดำเนินการ typecast จะดำเนินการ typecast ก่อนการบวก
ตัวอย่าง:
รหัส | คำอธิบาย |
---|---|
|
ตัวดำเนินการ typecast จะถูกนำไปใช้กับa ตัวแปรซึ่งเป็นbyte . รหัสนี้จะไม่รวบรวม |
|
นี่คือวิธีที่ถูกต้อง |
หากคุณต้องการแปลงนิพจน์ทั้งหมดเป็นประเภทเฉพาะ ไม่ใช่แค่ส่วนใดส่วนหนึ่งของนิพจน์ ให้รวมนิพจน์ทั้งหมดไว้ในวงเล็บแล้วใส่ตัวดำเนินการ typecast ไว้ข้างหน้า
GO TO FULL VERSION