Glib та типи даних у C мові

В 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:

  1. Беззнакові цілі числа: guint8 (0 до 255), guint16, guint32, guint64.
  2. Знакові та беззнакові цілі числа: gint8 (-128 до 127), gint16, gint32, gint64.
  3. Цілі типи: gshort, glong, gint, short, long, int, gsize.
  4. Логічні значення: gboolean, яке може мати лише два значення: TRUE та FALSE.
  5. Символи: gchar (аналог char).
  6. Строки: GString.
  7. Числа з плаваючою комою: gfloat, gdouble (аналогічно float та double).
  8. Вказівники: gpointer, який є еквівалентом стандартного C вказівника void*.

gint VS guint: 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

Обробка перетворень між цілими числами та вказівниками:

  1. GINT_TO_POINTER(): Перетворення int в тип gpointer.
  2. GPOINTER_TO_INT(): Перетворення gpointer в тип int.
  3. GUINT_TO_POINTER(): Перетворення uint в тип gpointer.
  4. GPOINTER_TO_UINT(): Перетворення gpointer в ціле число.
  5. GSIZE_TO_POINTER(): Перетворення gsize в тип gpointer.
  6. POINTER_TO_GSIZE(): Перетворення gpointer в тип gsize.
  7. 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 語言之間的資料型態

Leave a Reply

Your email address will not be published. Required fields are marked *