Integer
ในภาษา Rust การจัดการตัวเลขจำนวนเต็ม (Integer) มีการกำหนดประเภทที่ชัดเจนตามขนาดและชนิดของจำนวนเต็มที่ต้องการใช้ เช่น ขนาดของบิต (เช่น 8, 16, 32, 64, 128) และลักษณะการเก็บข้อมูล (Signed หรือ Unsigned)
- Signed integers (
i8
,i16
,i32
,i64
,i128
): ตัวเลขจำนวนเต็มที่สามารถเป็นค่าได้ทั้งบวกและลบ - Unsigned integers (
u8
,u16
,u32
,u64
,u128
): ตัวเลขจำนวนเต็มที่ไม่เป็นค่าลบ
ข้อจำกัด
เนื่องจาก Signed integers สามารถเก็บจำนวนลบได้ ทำให้ในกรณีที่จำนวนบิตเท่ากัน Unsigned integers จะสามารถเก็บจำนวนบวกได้มากกว่า
note
ตัวอย่าง Integer ขนาด 8 บิต
i8
จะมีช่วงของค่าอยู่ที่ -27 จนถึง 27 - 1u8
จะมีช่วงของค่าอยู่ที่ 0 จนถึง 28 - 1
ตัวอย่างการใช้งาน Integer
fn main() { let u_int:u8 = 255; let int:i8 = 127; println!("{} {}", u_int, int); }
ลองคิดดู
- จะเกิดอะไรขึ้นถ้าเราทำให้ค่าของตัวแปรไม่อยู่ในช่วงของประเภทที่เราประกาศ?
u32
มีช่วงของค่าที่เก็บได้เป็นเท่าไหร่?i32
มีช่วงของค่าที่เก็บได้เป็นเท่าไหร่?
Float
ในภาษา Rust ตัวเลขทศนิยมถูกแบ่งออกเป็นประเภทที่ชัดเจน โดยมี 2 ประเภทหลัก:
f32
: ตัวเลขทศนิยมแบบ 32 บิตf64
: ตัวเลขทศนิยมแบบ 64 บิต
การใช้ f32
และ f64
ขึ้นอยู่กับความต้องการในการจัดเก็บและความแม่นยำที่ต้องการในการคำนวณ โดยทั่วไปแล้ว f64
จะถูกใช้เป็นค่าเริ่มต้นเนื่องจากมีความแม่นยำสูงกว่า
ตัวอย่างการใช้งาน Float
fn main() { let f1:f32 = 1.0; let f2:f32 = 7.0; println!("{}", f1 / f2); }
ลองแก้โค้ดดู
- ลองเปลี่ยนชนิดของ
f1
และf2
เป็นf64
แล้วดูผลลัพธ์มีความแตกต่างจากเดิมหรือไม่- ลองเปลี่ยน
f1
และf2
เป็นinteger
แล้วสังเกตความแตกต่างที่เกิดขึ้น
Type Conversion
ในการเขียนโปรแกรมด้วยภาษา Rust บางครั้งเราจำเป็นต้องแปลงค่าจากชนิดข้อมูลหนึ่งไปยังอีกชนิดหนึ่ง เช่น จาก f64
ไปเป็น i64
หรือจาก u32
ไปเป็น f64
การแปลงชนิดข้อมูลสามารถทำได้โดยใช้คำสั่ง as
ซึ่งเป็นตัวดำเนินการสำหรับการแปลงชนิดข้อมูลใน Rust
ตัวอย่างการแปลงชนิดข้อมูล
fn main() { let float_num: f64 = 10.5; let int_num: i64 = float_num as i64; println!("{} convert to {}", float_num, int_num); }
ในตัวอย่างนี้ เราแปลงค่าจาก f64
ไปเป็น i64
โดยใช้ as i64
ซึ่งจะตัดส่วนทศนิยมออก
การดำเนินการกับตัวเลขชนิดต่างกัน
ในการดำเนินการทางคณิตศาสตร์ เช่น การบวก ลบ คูณ หาร หรือการเปรียบเทียบ Rust จะไม่อนุญาตให้ดำเนินการกับตัวแปรที่มีชนิดข้อมูลต่างกัน เราต้องทำการแปลงชนิดข้อมูลให้ตรงกันก่อนจึงจะสามารถดำเนินการได้
ตัวอย่างการดำเนินการกับตัวแปรชนิดต่างกัน
fn main() { let int_num: i32 = 10; let float_num: f32 = 5.5; let result = int_num as f32 + float_num; println!("sum : {}", result); }
ในตัวอย่างนี้ หากเราพยายามบวก int_num
กับ float_num
โดยตรงจะเกิดข้อผิดพลาด เนื่องจากชนิดข้อมูลไม่ตรงกัน เราจึงต้องแปลง int_num
เป็น f32
ก่อนด้วย as f32
note
Rust เป็นภาษาที่มีความเข้มงวดในการจัดการชนิดข้อมูล เพื่อป้องกันข้อผิดพลาดที่อาจเกิดขึ้นจากการแปลงชนิดข้อมูลโดยไม่ได้ตั้งใจ
ลองทำดู
- ลองแปลง
float_num
เป็นi32
แล้วสังเกตค่าที่ได้- ลองดำเนินการคูณระหว่าง
u8
และi8
โดยไม่แปลงชนิดข้อมูล แล้วดูว่ามีข้อผิดพลาดอะไรเกิดขึ้น?- ลองแปลง
i32
เป็นu32
และลองใส่ค่าที่เป็นลบ ดูว่าเกิดอะไรขึ้น?