В 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*.
gintVSguint: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 語言之間的資料型態