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 longfloat และ 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() เป็นฟังก์ชันในการแปลงตัวเลขจำนวนเต็มในฐานสิบไปตัวเลขฐานสองในรูปแบบของ 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 และเรายังให้ตัวอย่างสำหรับการสร้างฟังก์ชันในการแปลงข้อมูลของเราเอง


บทความเกี่ยวกับ Type conversions