ขนาดของตัวแปรใน ภาษา C ในแต่ละ CPU

ขนาดของตัวแปรใน ภาษา C หรือ C++ นั้นจะขึ้นอยู่กับชนิดของ CPU และ Complier ซึ่งอาจจะเหมือนกันหรือต่างกันก็ได้ เรามาดูกันดีกว่าว่าแต่ละ CPU มีการกำหนดขนาดตัวแปรที่แตกต่างกันอย่างไร

ขนาดของตัวแปรใน x86

ขนาดของตัวแปร ใน CPU ARM 32 bit

อ้างอิงจาก ARM Compiler Reference

ขนาดของตัวแปรใน MCU TI MSP430

อ้างอิงจาก slaa534 MSP430 Embedded Application Binary Interface

จะเห็นได้ว่า แต่ละ CPU จะมีขนาดของตัวแปรที่กำหนดแตกต่างกันไป ดังนั้นการเขียนโปรแกรมในภาษา C หรือ C++ แล้วนำเอาไปใช้งานในแต่ละ CPU จึงต้องระมัดระวัง เนื่องจากขนาดของตัวแปรที่แตกต่างกันอาจจะทำให้โปรแกรมของเราทำงานได้ไม่ถูกต้องก็ได้

ค่าสูงสุดและต่ำสุดของตัวแปร Real ในภาษา C

เราสามารถหาค่าสูงสุดและต่ำสุดของตัวแปร ตัวเลขจำนวนจริง (Real) แต่ละชนิดในภาษา C ได้จากค่า Define ที่อยู่ใน ไฟล์ float.h

ตารางด้านล่างนี้แสดง Define ที่ใช้สำหรับกำหนดค่าสูงสุด (Max) หรือต่ำสุด (Min) และความละเอียด (Precision)

ซึ่งสามารถนำเอาค่า Define มา print แสดงค่าได้ โดย Include ไฟล์ float.h ดัง Source code ตัวอย่าง

#include <stdio.h> /* For command line input and output */
#include <float.h> /* For limits on floating-point types */

int main(void)
{
    printf("min float is %.6e\n", FLT_MIN);
    printf("max float is %.6e\n", FLT_MAX);
    printf("float provide %u decimal digits precision.\n\n", FLT_DIG);

    printf("min double is %.15e\n",DBL_MIN);
    printf("max double is %.15e\n", DBL_MAX);
    printf("double provide %u decimal digits precision.\n\n", DBL_DIG);

    printf("min long double is %.18Le\n", LDBL_MIN);
    printf("max long double is %.18Le\n", LDBL_MAX);
    printf("long double provide %u decimal digits precision.\n",LDBL_DIG);

    return 0;
}

จะได้ผลลัพธ์ดังนี้ (Windows 7 32 bit, gcc 4.9.2)

สำหรับใครที่ลองเอา Code ไปรันแล้วเจอค่าขึ้น -1.#QNAN e+000 ดังรูป

วิธีแก้ไขก็คือเวลาที่เรา Compile ให้กำหนด standard ด้วย เช่น –std=c99 เวลา compile กับ gcc

สำหรับคนที่ใช้ Code Block ก็ให้เข้าไป Setting ค่าที่ setting complier ให้ ติ๊กถูก “Have gcc follow the 1999 ISO C language standard [-std=c99]”

ค่าสูงสุดและต่ำสุดของแต่ละตัวแปร integer ในภาษา C

เราสามารถหาค่าสูงสุดและต่ำสุดของตัวแปร ตัวเลขจำนวนเต็ม (Integer) แต่ละชนิดในภาษา C ได้จากค่า Define ที่อยู่ใน ไฟล์ limit.h
ตารางด้านล่างนี้แสดง Define ที่ใช้สำหรับกำหนดค่าสูงสุด (Max) หรือต่ำสุด (Min)

ซึ่งสามารถนำเอาค่า Define มา print แสดงค่าได้ โดย Include ไฟล์ limit.h ดัง Source code ตัวอย่าง

#include <stdio.h>
#include <limits.h> /* For limits on integer types */

int main(void)
{
    //unsigned char
    printf("min unsigned char = 0\n");
    printf("max unsigned char max = %u\n",UCHAR_MAX);
    printf("size unsigned char = %d\n\n", sizeof(unsigned char));
     //char
    printf("min char = %d\n",CHAR_MIN);
    printf("max char = %d\n", CHAR_MAX);
    printf("size char = %d byte\n\n\n",sizeof(char));

    //unsigned int
    printf("min unsigned int = 0\n");
    printf("max unsigned int  = %u\n", UINT_MAX);
    printf("size unsigned int  = %d\n\n", sizeof(unsigned int));
    //int
    printf("min int = %d\n", INT_MIN);
    printf("max int = %d\n", INT_MAX);
    printf("size int = %d byte\n\n\n", sizeof(int));


    //unsigned short
    printf("min unsigned short = 0\n");
    printf("max unsigned short = %u\n", USHRT_MAX);
    printf("size unsigned short = %d\n\n", sizeof(unsigned short));
    //short
    printf("min short = %d\n",SHRT_MIN);
    printf("max short = %d\n",SHRT_MAX);
    printf("size short = %d byte\n\n\n",sizeof(short));
    

    //unsigned long
    printf("min unsigned long = 0\n");
    printf("max unsigned long =  %lu\n",ULONG_MAX);
    printf("size unsigned long = %d\n\n",sizeof(unsigned long));
    //long
    printf("min long = %ld\n",LONG_MIN);
    printf("max long = %ld\n",LONG_MAX);
    printf("size long = %d byte\n\n\n", sizeof(long));


    //unsigned logn long
    printf("min unsigned long long = 0\n");
    printf("max unsigned long long = %llu\n", ULLONG_MAX);
    printf("min unsigned long long = %d\n\n", sizeof(unsigned long long));
    //logn long
    printf("min long long = %lld\n", LLONG_MIN);
    printf("max long long = %lld\n", LLONG_MAX);
    printf("size long long = %d byte\n\n\n", sizeof(long long));
    
    return 0;
}

จะได้ผลลัพธ์ดังนี้ (Windows 7 32 bit, gcc 4.9.2)

min unsigned char = 0
max unsigned char max = 255
size unsigned char = 1

min char = -128
max char = 127
size char = 1 byte

min unsigned int = 0
max unsigned int = 4294967295
size unsigned int = 4

min int = -2147483648
max int = 2147483647
size int = 4 byte

min unsigned short = 0
max unsigned short = 65535
size unsigned short = 2

min short = -32768
max short = 32767
size short = 2 byte

min unsigned long = 0
max unsigned long = 4294967295
size unsigned long = 4

min long = -2147483648
max long = 2147483647
size long = 4 byte

min unsigned long long = 0
max unsigned long long = 18446744073709551615
min unsigned long long = 8

min long long = -9223372036854775808
max long long = 9223372036854775807
size long long = 8 byte

การอ้างอิงที่อยู่ของการ Include Header file

การ Include header file ที่เราสร้างขึ้นมาโดยใช้ #include “file” แต่ว่าหากเราจะอ้างอิงที่อยู่ของ header file ในกรณีที่อยู่คนละ folder นั้นเราสามารถทำได้ โดยแบ่งได้เป็น 2 แบบ

แบบที่ 1 include header file ที่อยู่ใน folder ที่อยู่ใน level มากกว่า (folder ย่อยลึกเข้าไป)
จะใช้เครื่องหมายทับ \ ในการระบุ folder ย่อยๆเข้าไป โดยยึดจุดอ้างอิงจาก file .c ของเรา
สมมติว่าเรามี File ตามที่อยู่นี้
D:\Desktop\helloworld1.c
และ
D:\Desktop\test\helloworld1.h
เราสามารถ Include ได้โดย

#include <stdio.h>
#include "test/helloworld1.h"

int main (void)
{
    printf("%s\n", HELLO);
    return 0;
}

และแบบที่ 2 include header file ที่อยู่ใน folder ที่อยู่คนละ level
จะใช้เครื่องหมาย.จุดจุด .. ในการระบุ folder ที่ต้องออกมา 1 ชั้น โดยยึดจุดอ้างอิงจาก file .c ของเรา เช่นกัน

สมมติว่าเรามี File ตามที่อยู่นี้
D:\Desktop\main\helloworld2.c
และ
D:\Desktop\test\helloworld2.h
เราสามารถ Include ได้โดย

#include <stdio.h>
#include "../test/helloworld2.h"

int main (void)
{
    printf("%s\n", HELLO);
    return 0;
}

และอีกกรณี ก็คือ ต้องอ้างอิงออกไปมากกว่า 1 ชั้น โดย .. จะใช้แทนการอ้างอิงออกจาก folder นั้น 1 ชั้น
D:\Desktop\main\submain\helloworld3.c
และ
D:\Desktop\test\helloworld3.h

#include <stdio.h>
#include "../../test/helloworld3.h"

int main (void)
{
    printf("%s\n", HELLO);
    return 0;
}

หลักการใช้ #include

เราสามารถ แบ่งการ Include ในภาษา C ได้เป็น 2 แบบ นั้นก็คือ

#include <file>

และ

#include "file"

สังเกตได้ว่าจะแตกต่างกันที่เครื่องหมาย “” และ < >

เราจะใช้ < >

#include <file>

สำหรับการ include ไฟล์ ที่อยู่ใน folder ของ compiler เช่น header files (.h) ที่เป็นมาตรฐาน string.h, stdio.h, math.h หรือ library ที่เป็นมาตรฐานมากับ compiler อยู่แล้ว เหล่านี้เป็นต้น

ส่วน “”

#include "file"

จะเป็นการ include header file ที่ไม่ได้อยู่ใน folder compiler หรือ เป็น header file (.h) ที่เราสร้างขึ้นมาเอง

การใช้ #include ที่ไม่ถูกต้องอาจจะทำให้ compile แล้วเกิด warning หรือ error ก็ได้ขึ้นอยู่กับ compiler แต่ละตัว ดังนั้นควรจะใช้ #include ให้ถูกต้องกันด้วยละ

มารู้จักการ Comment ในภาษา C

เราสามารถแบ่ง การ comment ในการเขียนโปรแกรมภาษา C ออกได้เป็น 2 แบบ นั้นก็คือ Line comment กับ Block comment

Line comment จะสามารถ comment ได้ เพียงบรรทัดเดียวต่อครั้งโดยใช้ เครื่องหมายทับ 2 ตัว (//) หน้าบรรทัดที่เราอยาก comment
ตัวอย่าง Line comment

#include <stdio.h>

int main(void)
{

    // This is 
    // block 
    // comment
    printf("Hello world\n");

    return 0;
}

Block comment สามารถ comment code ได้หลายบรรทัดในครั้งเดียว โดยใช้ เครื่องหมาย ทับแล้วตามด้วยเครื่องหมายดอกจัน (/*) เพื่อเปิด comment และ เครื่องหมายดอกจันแล้วตามด้วยเครื่องหมายทับ(*/) เพื่อ ปิด comment
ตัวอย่าง Block comment

#include <stdio.h>

int main(void)
{

    /* This is 
    block 
    comment */ 
    printf("Hello world\n");

    return 0;
}

แต่การใช้ Block comment มีข้อควรระวังก็คือ code ที่เราจะ comment นั้นห้ามมี block comment อยู่ (ห้าม block comment ซ้อนกัน) จะทำให้ compile ไม่ผ่านได้
ตัวอย่าง Block comment ที่ compile ไม่ผ่าน

#include <stdio.h>

int main(void)
{

    /* This is 
    /*block */
    comment */ 
    printf("Hello world\n");

    return 0;
}

ตัวเลขจำนวนจริง (Real number) VS ตัวเลขจำนวนเต็ม (Integer number)

ในภาษา C เราสามารถแบ่งตัวแปรที่เป็นตัวเลขออกได้เป็น 2 ประเภทนั้นก็คือ ตัวเลขจำนวนจริง (Real number) และ ตัวเลขจำนวนเต็ม (Integer number)


ตัวเลขจำนวนจริง ก็คือ ตัวเลขที่เราวัดได้จากค่าจริงๆเช่น ส่วนสูงของเรา 180.23 เซนติเมตร, ต้นไม้สูง 10.23 เมตร หรือ ความเร็ว 64.53 กิโลเมตรต่อชั่วโมง เป็นต้นเราจะเห็นได้ว่าตัวเลขเหล่านี้ล้วนแล้วแต่เป็นค่าที่มีทศนิยม เพราะค่าเหล่านี้ล้วนแต่เป็นค่าที่วัดได้จริงๆ ดังนั้นในภาษา C หรือในภาษาโปรแกรมมิ่งทางคอมพิวเตอร์ จึงเรียกว่าว่าเป็น ตัวเลขจำนวนจริง Real number นั้นเอง


ตัวเลขจำนวนเต็ม ก็คือตัวเลขที่ไม่มีจุดทศนิยมนั้นเอง ตัวอย่างของ ตัวเลขจำนวนเต็ม(Integer number) เช่น รถ 3 คัน, จักรยาน 3 คัน, คน 1581 คน, บ้าน 1 หลัง เหล่านี้เป็นต้น

ทีนี้เพื่อนๆก็คงจะรู้จักกับตัวเลขในภาษา C ทั้ง 2 ประเภทกันแล้ว ว่าแต่ละประเภทเป็นอย่างไรและแตกต่างกันอย่างไร

วิธีแก้ไข ### ขึ้นเต็ม Cell ใน Excel

มีใครเคยเจอปัญหานี้บ้าง มี Cell หนึ่งที่มีตัว # ขึ้นเต็มทั้ง Cell ไปหมด แบบนี้

หลายๆคนคงจะคิดและอาจจะทำแบบนี้ คิดว่าอาจจะเป็นเพราะ Cell มีขนาดเล็กกว่าข้อมูล ก็เลยลองยืด Cell ขยายออกไปทางด้านข้างดูก็ยังมีผลลัพธ์เหมือนเดิม ยังคงเป็นสัญลักณ์ # อยู่

จริงๆแล้วสาเหตุที่ Cell นั้นแสดงผลเป็น ### นั้นเป็นเพราะว่า ข้อมูลใน Cell นั้นมี Format เป็น Text และ มีความยาวของตัวอักษรเกิน 256 ตัวอักษรนั้นเอง

วิธีแก้ไขก็คือให้เราทำการ เปลี่ยน Format ของ Cell เป็น General
มาดูวิธีทำตามตัวอย่างกันเลย

ก่อนอื่นให้เปลี่ยน Format โดยคลิกขวาที่ Cell นั้น แล้วเลือก Format Cells…

เปลี่ยน เป็น General แล้วกด OK

จะเห็นว่าข้อมูลใน Cell นั้นอ่านออกแล้ว

ปรับขนาดของ Cell ให้อ่านข้อมูลได้ เท่านี้ก็เสร็จเรียบร้อย

มารู้จักประโยชน์ของ Formula mode ใน Excel กันดีกว่า

สมมติเรามี ค่าอยู่ใน Cell A1, A3, A5 … แล้วเราต้องการก๊อปปี้มาใส่ Column C แต่ต้องการให้เรียงติดกันเป็น C1, C2, C3 …

ถ้าเราก๊อปปี้ Cell มาแล้วใช้วิธีลาก Cell ใน Column C ก็จะได้ผลลัพธ์ตามรูป นั้นคือจะไม่ได้อย่างที่เราต้องการ

วิธีทำง่ายๆก็คือต้องใช้ Formula mode ใน Excel
นั้นก็คือให้เราเข้าไปที่ Formula mode ใน Excel โดยการกด Ctrl + ~ (กด Ctrl แล้วตามด้วยปุ่มตัวหนอนเปลี่ยนภาษา) ก็จะทำให้เราเข้าสู่ Formula mode แล้วละ จะสังเกตได้ว่าจะมีเครื่องหมาย= อยู่ใน Cell

วิธีทำก็คือให้เราใส่ค่าเป็น A1 A3 A5 แล้วลาก Cell ให้ Excel มันรันตัวเลขของ Cell ที่เราอย่างได้ให้อัตโนมัติ

เสร็จแล้วเราก็ก๊อปปี้ไปใส่ Notepad แล้วทำการใส่ เครื่องหมายเท่ากับ = ให้มันสะ (โดยการ replace A เป็น =A)

แล้วก็เอามาวางใน Excel ที่เป็น โหมด Formula อยู่

แล้วทำการเปลี่ยนโหมดกลับมาเป็นเหมือนเดิมก็จะได้ดังภาพ

และนี้ก็เป็นอีกหนึ่งวิธีการประยุกต์ใช้งาน Formula โหมดใน Excel จ้า