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