Sobes.tech
Junior

Big Endian, Little Endian və Middle Endian notasiya haqqında nə bilirsiniz?

sobes.tech Süni İntellekt

AI-dan cavab

Big Endian: çoxbaytlı bir ədədin ən əhəmiyyətli (ən böyük) baytı ən aşağı yaddaş ünvanına yerləşdirilir və ən az əhəmiyyətli bayt ən yüksək ünvanına. Little Endian: çoxbaytlı bir ədədin ən az əhəmiyyətli baytı ən aşağı yaddaş ünvanına yerləşdirilir və ən əhəmiyyətli bayt ən yüksək ünvanına. Middle Endian: geniş qəbul olunmuş bir notasiya deyil. Bəzən, bu, baytların sırasının Big Endian və Little Endian-dən fərqli olduğu hallara işarə edir, məsələn, çoxbaytlı ədədlərin 2 baytlıq bloklar şəklində işlənməsi zamanı.

4 baytlıq 0x12345678 ədədi üçün nümunə:

Ünvan Big Endian Little Endian
0x1000 0x12 0x78
0x1001 0x34 0x56
0x1002 0x56 0x34
0x1003 0x78 0x12

Ən çox müasir prosessorlar (Intel, AMD) Little Endian istifadə edir. Şəbəkə protokolları, ümumiyyətlə, Big Endian istifadə edir ("şəbəkə ardıcıllığı" adlanır).

Sistem endianness-ni yoxlamaq üçün aşağıdakı kimi edilə bilər:

#include <iostream>

int main() {
    int x = 1;
    // Bayt göstəricisi yaradın və 1-in ilk baytına baxın (0x00000001)
    if (*reinterpret_cast<char*>(&x) == 1) {
        std::cout << "Little Endian" << std::endl;
    } else {
        std::cout << "Big Endian" << std::endl;
    }
    return 0;
}

C++-da bayt ardıcıllığını çevirmək üçün <arpa/inet.h> (şəbəkə ardıcıllığı üçün) və ya <endian.h> (ümumi) başlıqlarındakı funksiyalar istifadə olunur.

#include <arpa/inet.h> // htons, htonl, ntohs, ntohl

int main() {
    uint16_t host_short = 0x1234;
    uint32_t host_long = 0x12345678;

    // Host ardıcıllığından şəbəkə ardıcıllığına (Big Endian) çevrilmə
    uint16_t network_short = htons(host_short);
    uint32_t network_long = htonl(host_long);

    // Şəbəkə ardıcıllığından host ardıcıllığına çevrilmə
    uint16_t back_to_host_short = ntohs(network_short);
    uint32_t back_to_host_long = ntohl(network_long);

    return 0;
}