В C мові та в Glib, імена та концепції типів даних схожі, що може спричинити плутанину, але є також і суттєві відмінності. Нижче наведено основні відмінності та порівняння, щоб допомогти з’ясувати різницю між ними:
Типи даних у C мові
В C мові існує багато базових типів даних, таких як цілі числа, числа з плаваючою комою, символи тощо, а також в стандартній бібліотеці C є деякі структури та типи, які можна використовувати для розширення.
Основні типи даних у C:
1. Цілі типи даних (Integer Types):
int
: ціле число, розмір залежить від платформи, зазвичай 16, 32 або 64 біти.short
: тип для менших значень цілих чисел, зазвичай 16 біт.long
: тип для більших значень цілих чисел, зазвичай 32 чи 64 біти.long long
: зазвичай ціле число на 64 біти.unsigned
: беззнакове ціле число, що дозволяє збільшити діапазон значень.
2. Типи з плаваючою комою (Floating Point Types):
float
: число з плаваючою комою одинарної точності, зазвичай 32 біти.double
: число з плаваючою комою подвійної точності, зазвичай 64 біти.long double
: число з плаваючою комою розширеної точності.
3. Символьні типи (Character Types):
char
: символ, зазвичай 1 байт, що зберігає один символ, зазвичай ASCII.
4. Типи вказівників (Pointer Types):
- Вказівники для зберігання адрес пам’яті інших змінних.
5. Логічні типи даних (Boolean Types):
bool
для зберігання значень логічної змінноїtrue
абоfalse
.
Типи даних GLib
Бібліотека GLib є однією з найбільш використовуваних C бібліотек на платформі Linux. Вона є кросплатформною і не потребує значних змін, щоб працювати на Linux, Unix або Windows. Ця бібліотека надає низку корисних API для роботи з низькорівневими операціями. Для ознайомлення з бібліотекою GLib можна переглянути GLib — 2.0 та знайти відповідні API. GLib та C мова мають деякі схожі типи даних, які на вигляд можуть бути однаковими, але насправді вони різні. Нижче наведено їх відмінності.
Біт (bit) є найменшою одиницею зберігання в пам’яті, він може мати значення лише 0 або 1. 8 бітів складають 1 байт (Byte), а 1 слово (WORD) складається з 2 байт (16 біт), 4 байт (32 біт), або 8 байт (64 біти). Якщо ви зустрічаєте DWORD, це означає Double WORD, який може зберігати 4 байти, тобто 32 біти.
Основні типи даних у GLib:
- Беззнакові цілі числа:
guint8
(0 до 255),guint16
,guint32
,guint64
. - Знакові та беззнакові цілі числа:
gint8
(-128 до 127),gint16
,gint32
,gint64
. - Цілі типи:
gshort
,glong
,gint
,short
,long
,int
,gsize
. - Логічні значення:
gboolean
, яке може мати лише два значення: TRUE та FALSE. - Символи:
gchar
(аналогchar
). - Строки:
GString
. - Числа з плаваючою комою:
gfloat
,gdouble
(аналогічноfloat
таdouble
). - Вказівники:
gpointer
, який є еквівалентом стандартного C вказівникаvoid*
.
gint
VSguint
:guint
може зберігати лише значення від 0 до позитивного числа, і не може зберігати від’ємні числа. Для зберігання від’ємних значень слід використовуватиgint
.Якщо ви визначили
guint8
, але намагаєтеся записати значення 0xFF або більше 255, це призведе до помилки.
Формати введення/виведення типів змінних у C
%c - Для символу
%d - Для цілих чисел
%f - Для чисел з плаваючою комою (double)
%s - Для рядка символів з нульовим термінатором
%p - Для вказівників (тип `void *`)
Ось як можна оголосити типові змінні для прикладу:
#include “fruit_list.h”
#define apple 20;
char name[10]
int strawberry 5
guint8 banana[10] = {0};
guint8 pineapple 20;
gsize grape;
g_autoptr(GByteArray) mango;
g_autofree gchar *blueberry = NULL;
// Виведення
// %s для рядка
g_print("Hello, I'm %s", name);
> Hello, I'm Jane
// %d для десяткового числа
g_print("Decimal: %d", apple);
> Decimal: 20
// %x для шістнадцяткової системи
g_print("Hexadecimal: 0x%x", apple);
> Hexadecimal: 0x14
Перетворення типів вказівників у GLib
Обробка перетворень між цілими числами та вказівниками:
GINT_TO_POINTER()
: Перетворенняint
в типgpointer
.GPOINTER_TO_INT()
: Перетворенняgpointer
в типint
.GUINT_TO_POINTER()
: Перетворенняuint
в типgpointer
.GPOINTER_TO_UINT()
: Перетворенняgpointer
в ціле число.GSIZE_TO_POINTER()
: Перетворенняgsize
в типgpointer
.POINTER_TO_GSIZE()
: Перетворенняgpointer
в типgsize
.g_steal_pointer
: Передача власності вказівника викликаючій стороні та обнулення оригінального вказівника.
gpointer my_pointer = g_malloc(100); // Припустимо, це виділена пам'ять
my_pointer = g_steal_pointer(&my_pointer); // Перехід власності вказівника
// Тепер my_pointer вказує на ту ж саму ділянку пам’яті, а оригінальний вказівник вже не має доступу
Джерела:
- GLib Reference Manual
[
Basic Types
GLib визначає низку часто використовуваних типів, які можна поділити на 4 групи: typedef gint gboolean; Стандарт…
www.geany.org
](https://www.geany.org/manual/gtk/glib/glib-Basic-Types.html?source=post_page-----7e294e937da9--------------------------------)
- GLib — 2.0
[
GLib-2.0
Посібник для GLib-2.0
docs.gtk.org
](https://docs.gtk.org/glib/index.html?source=post_page-----7e294e937da9--------------------------------)
Перекладено з: Glib 與 C 語言之間的資料型態