การCastและช่วง
แนะนำใหม่| English | ความหมาย |
|---|---|
| casting/ˈkæstɪŋ/ | การแปลงชนิดข้อมูล |
| truncates/ˈtrʌŋkeɪts/ | ตัดทอน |
| widening/ˈwaɪdənɪŋ/ | ขยายขอบเขต |
| narrowing/ˈnærəʊɪŋ/ | ลดขอบเขต |
| range/reɪndʒ/ | ช่วงของค่า |
| overflow/ˌəʊvəˈfləʊ/ | การล้นของค่า |
เปลี่ยนประเภทของค่า
- Casting แปลงค่าจากประเภทหนึ่งไปยังอีกประเภทหนึ่ง
- เขียนประเภทเป้าหมายในวงเล็บ:
(double) 5ให้5.0;(int) 3.9ให้3 - Casting ไปยัง
intตัดทอน — มันทิ้งส่วนทศนิยม, ไม่ได้ round (int) 3.9คือ3, และ(int) -2.7คือ-2(toward zero)
Widening เกิดขึ้นโดยอัตโนมัติ
- การเปลี่ยนจากประเภทเล็กไปใหญ่ (
int→double) คือ widening - Widening ปลอดภัย, ดังนั้น Java ทำมัน อัตโนมัติ:
double d = 5;เก็บ5.0 - ไม่มีข้อมูลสูญหายจากการเปลี่ยนจาก
intไปdouble - คุณไม่ค่อยจำเป็นต้องเขียน widening cast, แต่มันอนุญาต
Narrowing ต้องการ cast แบบexplicit
- การเปลี่ยนจากใหญ่ไปเล็ก (
double→int) คือ narrowing — สามารถสูญเสียข้อมูลได้ - Java ต้องการ explicit cast:
int n = (int) 3.9;(without the cast, it won't compile) - The cast คือการคุณสัญญาว่า "ฉันรู้ว่าฉันกำลังทิ้งทศนิยม"
- Narrowing ตัดทอน toward zero
ช่วงและ overflow
- แต่ละประเภทมี range ที่ตายตัว:
intเก็บได้ประมาณ ±2.1 พันล้าน - การเกิน range ทำให้เกิด overflow — ค่าหมุนวนกลับเป็นตัวเลขผิด
- ไม่มี error ถูกยกขึ้น; ผลลัพธ์คือสิ่งที่ไม่ถูกต้องอย่างเงียบๆ
- สำหรับจำนวนเต็มขนาดใหญ่, ต้องใช้ประเภทที่ใหญ่กว่า (เช่น
long)
การแปลงประเภท int จะตัดทอน — ไม่มีการปัดเศษ. (int) 3.9 คือ 3, ไม่ใช่ 4; (int) 2.99 คือ 2. เพื่อบังคับให้เป็นการหารแบบ float ให้แปลงตัวประกอบหนึ่ง: (double) 7 / 2 คือ 3.5, แต่ (int)(7.0 / 2) คือ 3. และระวังเรื่อง overflow: ผลลัพธ์ของ int ที่เกิน ±2.1 พันล้านจะวนกลับโดยไม่มีข้อผิดพลาด
การหาค่าเฉลี่ยของ int สองค่าอย่างถูกต้อง:
int a = 7, b = 2;int avg = a / b;→3(การหาร int จะทิ้งเศษ — น่าจะไม่ใช่สิ่งที่คุณต้องการ).double avg = (double) a / b;→3.5(การแปลงด้านหนึ่งจะบังคับให้ทำการหารแบบทศนิยม).
การแปลงประเภท (Casting) (type) value เปลี่ยนระหว่างชนิดข้อมูล. int → double (widening) ทำอัตโนมัติและปลอดภัย; double → int (narrowing) ต้องใช้ explicit cast และ ตัดทอน เข้าใกล้ศูนย์ (ไม่มีการปัดเศษ). แต่ละชนิดมี ช่วง (range) ที่กำหนดไว้; หากเกินช่วงนี้จะเกิด overflow โดยเงียบ.
การCastระหว่างintและdouble
(int)ตัดทอน3.9เป็น3; การCastด้านหนึ่งจะได้3.5
ค่าของ (int) 3.9 ในJavaคืออะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
การCastเป็นintตัดทอน (ทิ้งทศนิยม) → 3, ไม่ใช่ 4
การแปลงintเป็นdouble (การแปลงที่ปลอดภัยโดยอัตโนมัติ) เรียกว่า...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
เล็ก → ใหญ่คือการwidening, ทำโดยอัตโนมัติ
สิ่งใดต้องการexplicit castเพื่อCompile?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
double → intคือการnarrowingและต้องการexplicit cast
ค่าของ (double) 7 / 2คืออะไร?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
การ cast operand ตัวหนึ่งจะบังคับให้เป็นการหารแบบทศนิยม → 3.5
ผลลัพธ์ int ที่เกินช่วงค่าที่กำหนดจะทำให้เกิด overflow ซึ่ง Java จะรายงานเป็นข้อผิดพลาด
Difficulty 1/5 · 100 coins + a small bonus on first completion today
Overflow จะวนรอบโดยเงียบ — ไม่มีการยกข้อผิดพลาด