Type conversions
ในบทนี้ คุณจะได้เรียนรู้และเข้าใจเกี่ยวกับการแปลงข้อมูลในภาษา C++ สำหรับแปลงข้อมูลอีกประเภทหนึ่งไปเป็นอีกประเภท ซึ่งการแปลงข้อมูลจะมีอยู่สองแบบใหญ่ๆ คือ Implicit type conversion และ Explicit type conversion และเราจะพูดถึงการแปลงข้อมูลกับข้อมูลประเภท String ที่ใช้ฟังก์ชันจากไลบรารี่ในภาษา C++
Implicit conversion
Implicit conversion เป็นการแปลงข้อมูลมาตรฐานที่จะทำอัตโนมัติเมื่อเราทำการกำหนดค่าให้กับตัวแปร หรือเมื่อตัวแปรหนึ่งถูกคัดลอกไปยังตัวแปรหนึ่ง เราได้เห็นมาแล้วในหลายๆ ตัวอย่างที่ผ่านมา
int a = 10.5;
short b = 4;
float c = a / b;
ในตัวอย่างนี้ เรามี 3 คำสั่ง และแต่ละคำสั่งได้ทีการแปลงข้อมูลแบบ Implicit conversion เราได้สร้างตัวแปร a
และ b
ในตัวอย่างเราจะได้ a
เป็น 10
เพราะว่าตัวแปร a
นั้นเป็น Integer ถึงแม้ว่าเราจะได้กำหนดค่า 10.5 ให้มัน แต่คอมไพเลอร์จะทำการแปลงข้อมูลอัตโนมัติ นี้เรียกว่า Implicit conversion
Expression int c = a / b;
และตัวแปร c
จะมีค่าเป็น 2
เพราะเกิดจาการทำงานของคำสั่ง a / b
เนื่องจากตัวแปรทั้งสองทั้ง a
และ b
มีประเภทเป็น int
ถึงแม้ว่าเราจะใช้คำสั่ง short
ในการประกาศตัวแปร b
แต่มันมีขนาดเล็กกว่า int
และทั้งสองประเภทเก็บข้อมูลประเภทเดียวกัน
int a = 5;
int b = 2;
float c = a / b; // 2
float d = a / (float) b; // 2.5
สิ่งหนึ่งที่เกิดขึ้นบ่อยในการเขียนโปรแกรมสำหรับผู้เริ่มต้นคือ การหารตัวเลขจำนวนเต็มด้วยจำนวนเต็ม (int / int) นั้นจะได้ผลลัพธ์เป็น Integer เสมอ ถ้าหากคุณต้องการผลลัพธ์ที่เป็นทศนิยม อย่างน้อยหนึ่งค่าใน Expression ต้องเป็นข้อมูลประเภท Float เหมือนในตัวอย่างในตัวแปร c
และ d
Type casting (Explicit type conversion)
ในภาษา C++ เราสามารถแปลงข้อมูลโดยการใช้วิธีที่เรียกว่า Type-casting หรือ Explicit type conversion มันมีสองวิธีในการทำคือแบบ functional และ c-like เราสามารถใช้ได้ทั้งแบบ functional และ c-like ข้อแตกต่างของรูปแบบการใช้งานของมันเป็นดังนี้:
double n = 10.3;
float m = 5.5;
int x = int (n); // functional
int y = (int) n; // c-like
ในตัวอย่างนี้ แสดงให้คุณเห็นวิธีการแปลงข้อมูลโดยใช้ทั้งสองวิธี วิธี functional นั้นเป็นการทำงานเหมือนฟังก์ชันโดยจะมีชื่อฟังก์ชันเป็นประเภทข้อมูลที่คุณเห็นเป็น int()
และมีอาร์กิวเมนต์เป็นตัวเลขที่เราต้องการแปลง วิธีที่สองคือ c-like เราใช้ประเภทของข้อมูลที่ต้องการแปลงล้อมรอบด้วยวงเล็บ (int)
และตามด้วยค่าหรือตัวแปร ตัวอย่างเพิ่มเติม
float a = (float) (10 / 4); // 2
float b = (float) 10 / 4; // 2.5
float c = 10.0 / 4; // 2.5
มาพิจารณาตัวอย่างด้านบน คำสั่งแรกจะได้ผลลัพธ์ของ a
เป็น 2
เพราะเราทำการหารตัวแปรของ integer สองตัวก่อนที่จะแปลงไปเป็น float ดังนั้นมันจึงได้ค่าเป็น integer อยู่แล้ว ยกเว้นในคำสั่งบรรทัดที่สองและสาม ลำดับความสำคัญของประเภทข้อมูลแบบ float และ double ทำให้การหารระหว่าง 10.0 / 4
เป็นทศนิยมได้
อย่างไรก็ตามการแปลงข้อมูลด้วยวิธี Explicit type conversion นี้สามารถใช้ได้เพียงกับ Primitive data type ที่สามารถแสดงในรูปแบบของตัวเลขได้เท่านั้น เช่น bool
char
int
long``float
และ double
เป็นต้น
ASCII code table
ต่อไปมาดูตัวอย่างโปรแกรมการแปลงข้อมูลของเรา ซึ่งเป็นโปรแกรมในการแปลง String ในเลขฐานสองไปเป็น Integer และแปลงจาก Integer ไปเป็นเลขฐานสอง และยังแสดงตาราง ASCII
#include <iostream>
#include <cmath>
#include <string>
using namespace std;
string int_to_bin(int);
int bin_to_int(string);
int main()
{
cout << "Binary / Decimal table" << endl;
cout << "Number\tint_to_bin\tbin_to_int\tChar" << endl;
for (int i = 0; i <= 127 ; i++)
{
string bin = int_to_bin(i);
int dec = bin_to_int(bin);
cout << i << "\t" << bin << "\t" << dec
<< "\t" << (char)i << endl;
}
return 0;
}
string int_to_bin(int n)
{
string bin = "";
while (n > 0)
{
bin = (n % 2 == 0 ? "0" : "1") + bin;
n /= 2;
}
return bin;
}
int bin_to_int(string s)
{
int len = s.length();
int dec = 0;
for (int i = 0; i < len; i++)
{
dec += ((int)s[i] - '0') * pow(2, len - i - 1);
}
return dec;
}
ในตัวอย่าง เป็นโปรแกรมในการแปลงข้อมูลในตัวเลขฐานสองและฐานสิบ โดยมีฟังก์ชันที่สำคัญอยู่สองฟังก์ชันคือ ฟังก์ชัน int_to_bin()
เป็นฟังก์ชันในการแปลงตัวเลขจำนวนเต็มในฐานสิบไปตัวเลขฐาน 2 ในรูปแบบของ String และฟังก์ชัน bin_to_int()
นั้นแปลงในทางตรงกันข้าม
string int_to_bin(int n)
{
string bin = "";
while (n > 0)
{
bin = (n % 2 == 0 ? "0" : "1") + bin;
n /= 2;
}
return bin;
}
นี่เป็นฟังก์ชันในการแปลงจากตัวเลขจำนวนเต็มในฐาน 10 ไปเป็นฐานสอง String เราได้ทำการแปลงโดยการใช้อัลกอรึทึมของการแปลงตัวเลขฐานสอง
int bin_to_int(string s)
{
int len = s.length();
int dec = 0;
for (int i = 0; i < len; i++)
{
dec += ((int)s[i] - '0') * pow(2, len - i - 1);
}
return dec;
}
และฟังก์ชันนี้เป็นการแปลงจากฐานสอง String ไปเป็นตัวเลข Integer เราได้ทำการวนลูปทุกตำแหน่งของตัวเลขฐานสองและนำเข้าสู่สูตรของการแปลงตัวเลข ยกตัวอย่างเช่นเรามี 111
และจะใช้อัลกอรึมทึมของการแปลงจากฐานสองไปเป็นฐาน 10 ทำให้ได้สูตรเป็น (1 × 22) + (1 × 21) + (1 × 20)
นั่นเป็นสิ่งที่โปรแกรมทำ
dec += ((int)s[i] - '0') * pow(2, len - i - 1);
นี่เป็นการทำงานสำหรับสูตรของการแปลงตัวเลข ในคำสั่ง ((int)s[i] - '0')
นั้นเป็นการแปลงจาก Char ของตัวอักษร 0
และ 1
ไปเป็น Integer เราเราลบด้วย '0'
เพราะว่าค่าของ 0
ใน Integer นั้นมีค่าเท่ากับ 48
คุณสามารถเรียนรู้เพิ่มเติมเกี่ยวกับ ASCII และฟังก์ชัน pow()
เป็นฟังก์ชันในการยกกำลังตัวเลขโดยมีพารามิเตอร์ตัวแรกเป็นฐานของเลขยกกำลัง และตัวที่สองเป็นเลขชี้กำลัง
Binary / Decimal table
Number int_to_bin bin_to_int Char
0 0
1 1 1 ☺
2 10 2 ☻
3 11 3 ♥
4 100 4 ♦
5 101 5 ♣
6 110 6 ♠
7 111 7
8 1000 8
9 1001 9
10 1010 10
11 1011 11 ♂
12 1100 12 ♀
13 1101 13
14 1110 14 ♫
15 1111 15 ☼
16 10000 16 ►
17 10001 17 ◄
18 10010 18 ↕
19 10011 19 ‼
20 10100 20 ¶
21 10101 21 §
22 10110 22 ▬
23 10111 23 ↨
24 11000 24 ↑
25 11001 25 ↓
26 11010 26 →
27 11011 27 ←
28 11100 28 ∟
29 11101 29 ↔
30 11110 30 ▲
31 11111 31 ▼
32 100000 32
...
นี่เป็นผลลัพธ์การทำงานของโปรแกรม ในการแสดงตาราง ASCII ของเรา
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการแปลงข้อมูบในภาษา C++ เราได้พูดเกี่ยวกับการแปลงแบบ Implicit และ Explicit type conversions โดยที่การแปลงแบบ Explicit นั้นจะมีสองวิธีคือแบบการใช้ฟังก์ชันและแบบ c-like และเรายังให้ตัวอย่างสำหรับการสร้างฟังก์ชันในการแปลงข้อมูลของเราเอง