2. จำานวนนั้นเป็นเลขคู่
else
จำาวนนั้นเป็นเลขคี่
end
การแทนข้อ มูล ในระบบคอมพิว เตอร์ – แทนด้ว ยเลขฐานสอง
- ข้อ มูล ชนิด ตัว อัก ขระ – 8 บิต/ตัวอักขระ – ข้อมูลชนิด char
- ตัวแปรชนิด char – เก็บตัวอักขระได้ 1 ตัว จากที่เป้นไปได้ทั้งหมด 256 ตัว
- ค่าคงทีอักขระ กำากับด้วยเครืองหมายคำาพูดเดี่ยว เช่น ‘A’
่
่
- สายอักขระ (string) คือ array of char ประกอบด้วยอักขระหลายตัวต่อเนื่องกัน และปิดท้าย
ด้วยอักขระ null (‘0’)
- ค่าคงที่สายอักขระ หรือค่าคงที่ string กำากับด้วยเครืองหมายคำาพูดคู่ เช่น “Hello”
่
- ‘A’ เป็นค่าคงทีอักขระ ส่วน “A” เป็นค่าคงที่ string
่
- ข้อ มูล ชนิด จำา นวน (Number)
- จำานวนนับ หรือจำานวนธรรมชาติ (Natural number) – N = { 0, 1, 2, 3, … }
- ภาษา C กำาหนดให้ใช้คำา unsigned (ไม่มีเครื่องหมาย) ประกอบ เช่น
unsigned int
n;
หมายความว่ากำาหนดให้ n เป็นสมาชิกของเซตชื่อ unsigned int ซึ่งเป็นเซตย่อยของ
จำานวนนับ หรือจำานวนเต็มชนิดไม่มีเครื่องหมาย เขียนในรูปแบบทางคณิตศาสตร์ได้
เป็น n ∈ unsigned int และ unsigned int ⊂ N ดังนั้นตัวแปร n จึงไม่สามารถเก็บ
จำานวนเต็มลบได้
- การแปลงจำานวนธรรมชาติฐานสิบ เป็นจำานวนธรรมชาติฐานสอง ใช้วิธีการแปลง
โดยตรง และเลขฐานสองทุกบิตที่แปลงได้เป็น “ค่า”
- จำานวนเต็ม (Integer) – Z = { … , -2, -1, 0, 1, 2, … }
- ภาษา C กำาหนดให้ใช้คำา signed (มีเครื่องหมาย) ประกอบ เช่น
signed int
a;
หมายความว่ากำาหนดให้ a เป็นสมาชิกของเซตชื่อ signed int ซึ่งเป็นเซตย่อยของ
จำานวนเต็มชนิดมีเครื่องหมาย เขียนในรูปแบบทางคณิตศาสตร์ได้เป็น a ∈ signed int
และ signed int ⊂ Z ดังนั้นตัวแปร a จึงสามารถเก็บจำานวนเต็มได้ทั้งจำานวนบวกและ
จำานวนลบ
- จำานวนเต็มชนิดมีเครื่องหมายมีที่ใช้งานในโปรแกรมมากกว่าจำานวนเต็มชนิดไม่มี
เครืองหมาย เพื่อความสะดวกในการเขียนโปรแกรม ภาษา C จึงกำาหนดให้คำาว่า
่
signed เป็นค่าโดยปริยาย (default value) กล่าวคือ หากผูใช้จะกำาหนดเองต้อง
้
3. เขียนให้ถูกต้อง หากผู้ใช้ละไว้ระบบจะกำาหนดให้เป็น signed โดยอัตโนมัติ ดังนั้น
การประกาศตัวแปร
signed int
a;
และ
int
a;
จึงมีความหมายเช่นเดียวกัน
- ระบบเลขฐานสองที่ใช้แทนจำานวนเต็มชนิดมีเครื่องหมายฐานสิบ เรียกว่าระบบส่วน
เติมเต็มสอง (two’s complement หรือ 2’s complement)
จำานวนจริง (Real number) – หรือเซตของ R
- สามารถแปลงจำานวนจริงฐานสิบเป็นจำานวนจริงฐานสองได้
- จำานวนจริงฐานสองไม่เหมาะสมในการจัดเก็บในระบบคอมพิวเตอร์ จึงต้องกำาหนด
จำานวนที่ใกล้เคียงเพื่อใช้แทน เรียกว่า Floating point number ซึ่ง IEEE ซึ่งเป็น
องค์กรกำาหนดมาตรฐานด้านวิศวกรรมและคอมพิวเตอร์ มาตรฐานนี้เรียกว่า IEEE
754 ซึ่งกำาหนดให้มี 2 แบบคือ
ตัวเลขชนิด Single precision ขนาด 32 บิต
float ใน
ภาษา C
ตัวเลขชนิด Double precision ขนาด 64 บิต
double ในภาษา C
- เพื่อความสะดวกในการเรียนการสอน กำาหนดให้มี Microfloat ขนาด 8 บิต เพื่อใช้ใน
การสร้างแนวคิด และสามารถคิดในใจได้
การหารจำานวนเต็ม
เซตของจำานวนเต็ม “ปิด” สำาหรับการหาร หมายความว่า ตัวตั้ง (dividend) เป็นจำานวนเต็ม และ
ตัวหาร (divisor) เป็นจำานวนเต็ม ผลหาร (quotient) เป็นจำานวนเต็ม และเศษที่เหลือจากการหาร
(remainder) เป็นจำานวนเต็ม
การแปลงเลขฐานสิบเป็นฐานอื่น
กำาหนดให้ r (radix) เป็นฐานที่ตองการ
้
กำาหนดให้ d (digit) เป็นเลขฐานสิบทีต้องการแปลงเป็นฐาน r
่
วิธีการ
หารจำานวนเต็มฐานสิบด้วย r เก็บเศษที่เหลือจากการหารไว้ ทำาจนกว่าผลหารจะเป็นศูนย์
เรียงเศษที่เหลือจากการหารจากล่างขึ้นบน
ทำาจนกว่าผลหารจะเป็นศูนย์ โครงสร้างการทำางานแบบทำาซำ้า (loop) มีเงื่อนไขการเลิกทำางานเมื่อ ผล
หาร (quotient) เป็นศูนย์ หรือ q = 0
เลือกใช้โครงสร้าง while ทำาซำ้าเมื่อเงื่อนไขเป็นจริง จึงต้องปรับเงื่อนไขใหม่เป็น
while ( q != 0 ) {
4. …
}
- เศษของการหารที่ได้จากการทำางานในแต่ละรอบ เก็บในตัวแปรแถวลำาดับ (array)
- จากตัวอย่างการหาร ผลหาร (quotient) ของการทำางานรอบปัจจุบัน ใช้เป็นตัวตั้ง (dividend) ของรอบ
ต่อไป ทำาอย่างไรจึงจเปลี่ยนผลหารของรอบปัจจุบันเป้นตัวตั้งของรอบต่อไปได้
การแปลงเลขฐานอื่นเป็นฐานสิบ
กำาหนดให้ r เป็นฐานทีต้องการ
่
กำาหนดให้ d (digit) เป็นเลขในฐาน r ที่ตองการแปลงเป็นฐานสิบ
้
วิธีการ หาผลบวกของเลขทุกหลัก x นำ้าหนักประจำาหลัก
n
∑
i =1
di × r
i
y
- การหาค่าของ x ทำาได้โดยการเรียกใช้ฟังก์ชัน pow() ซึ่งกำาหนดรูปแบบการใช้งานไว้ใน <math.h>
- การหาผลบวกสะสม ทำาได้โดยการใช้โครงสร้างทำาซำ้า เช่น for
sum = 0
for ( int i = 0; i < n ; ++i )
sum += d[i] * pow(r, i);
การแปลงจำานวนเต็มที่มีเครื่องหมาย (signed integer) เป็นเลขฐานสอง
ระบบที่ใช้ – ระบบส่วนเติมเต็มสอง (Two’s complement หรือ 2’s complement)
ข้อมูลทีจำาเป็น – จำานวนบิตของตัวเลขในระบบ 2’s complement
่
ใช้คำานวณหาพิสัยของค่าที่เป็นไปได้
- เลขฐานสิบที่จะนำามาแปลงต้องอยูในพิสัย
่
การคำานวณพิสัยจากจำานวนบิต
กำาหนดให้จำานวนบิต = n
จำานวนเต็มที่ไม่มีเครื่องหมาย (ungned int) ทุกบิตใช้แทนค่า
n
02 -1
จำานวนเต็มที่ไมีเครื่องหมาย (signed int)
1 บิต ใช้แทนเครื่องหมาย – บิตที่มีนัยสำาคัญสูงสุด
0 แทนจำานวนบวก (positive)
1 แทนจำานวนลบ (negative)
n – 1 บิตใช้แทนค่า พิสัยจึงอยู่ระหว่าง
n-1
-2
2
n-1
-1
วิธีการ
จำานวนบวก ใช้วิธการเดียวกับจำานวนเต็มชนิดไม่มีเครื่องหมาย (unsigned integer)
ี
5. จำำนวนลบ
แปลงค่ำสัมบูรณ์เป็นเลขฐำนสอง จำำนวน n บิต
กลับบืตทุกบิต
บวกด้วย 1
โครงสร้ำง
if จำำนวนบวก then
…
else
…
end
ทำำอย่ำงไรจึงจะรู้ว่ำค่ำในตัวแปร d เป็นจำำนวนบวกหรือจำำนวนลบ
เปรียบเทียบค่ำในตัวแปร d กับ ...
เปรียบเทียบอย่ำงไร ==, !=, >, >=, <, <=
Algorithm: กำรแปลงจำำนวนเต็มชนิดมีเครื่องหมำยฐำนสิบ เป็นเลขฐำนสองในระบบ 2’s complement
Input:
d – จำำนวนเต็มชนิดมีเครื่องหมำยฐำนสิบ ที่มีคำระหว่ำง -128 +127
่
Output:
b – เลขฐำนสองขนำด 8 บิตในระบบ 2’s complement
begin
if d ≥ 0 then
แปลง d เป็นเลขฐำนสอง ขนำด 8 บิต เก็บในตัวแปร b
… … … (1)
else
d=|d|
// ค่ำสัมบูรณ์
แปลง d เป็นเลขฐำนสอง ขนำด 8 บิต เก็บในตัวแปร b
… … … (2)
… … … (3)
กลับบิตทุกบิตใน b (เรียกว่ำ 1’s complement หรือ complement)
บวกค่ำใน b ด้วย 1
end
// ค่ำใน b คือเลขฐำนสองในระบบ 2’s complement
end
จำก Algorithm ข้ำงต้น จะเห็นว่ำบรรทัดทีกำำกับด้วย (1) และ (3) มีกำรทำำงำนเหมือนกัน สำมำรถแยก
่
ออกนอกโครงสร้ำง if ได้ (แบบเดียวกับกำรแยกตัวประกอบ) แต่ต้องนำำคำำสั่งกำรหำค่ำสัมบูรณ์ออกไปด้วย
ซึ่งกำรดำำเนินกำรดังกล่ำวนีไม่มีผลต่อจำำนวนบวก โครงสร้ำงที่จัดใหม่แล้วเป็นดังนี้
้
Algorithm: กำรแปลงจำำนวนเต็มชนิดมีเครื่องหมำยฐำนสิบ เป็นเลขฐำนสองในระบบ 2’s complement
Input:
Output:
begin
d – จำำนวนเต็มชนิดมีเครื่องหมำยฐำนสิบ ที่มีคำระหว่ำง -128 +127
่
b – เลขฐำนสองขนำด 8 บิตในระบบ 2’s complement
6. negative = false;
// สมมุตให้ d เป็นจำำนวนเต็มทีไม่ใช่จำำนวนลบ
ิ
่
if d < 0 then negative = true end
d=|d|
// ค่ำสัมบูรณ์
แปลง d เป็นเลขฐำนสอง ขนำด 8 บิต เก็บในตัวแปร b
if negative then
// จำำนวนลบ
กลับบิตทุกบิตใน b (เรียกว่ำ 1’s complement หรือ complement)
บวกค่ำใน b ด้วย 1
end
// ค่ำใน b คือเลขฐำนสองในระบบ 2’s complement
end
เมื่อปรับปรุงขั้นตอนวิธีดีแล้ว สำมำรถนำำไปประยุกต์เป็นโปรแกรมด้วยภำษำที่สนใจต่อไปได้
7. negative = false;
// สมมุตให้ d เป็นจำำนวนเต็มทีไม่ใช่จำำนวนลบ
ิ
่
if d < 0 then negative = true end
d=|d|
// ค่ำสัมบูรณ์
แปลง d เป็นเลขฐำนสอง ขนำด 8 บิต เก็บในตัวแปร b
if negative then
// จำำนวนลบ
กลับบิตทุกบิตใน b (เรียกว่ำ 1’s complement หรือ complement)
บวกค่ำใน b ด้วย 1
end
// ค่ำใน b คือเลขฐำนสองในระบบ 2’s complement
end
เมื่อปรับปรุงขั้นตอนวิธีดีแล้ว สำมำรถนำำไปประยุกต์เป็นโปรแกรมด้วยภำษำที่สนใจต่อไปได้