bardzo proste pytanie, czytałem, że GCC obsługuje długie długie typu int. Ale w jaki sposób można wykonywać operacje matematyczne, gdy procesor ma tylko 32-bitową szerokość?Długi int na 32-bitowych komputerach
Odpowiedz
Kompilator zsyntetyzuje operacje matematyczne (lub korzysta z wywołań funkcji), które używają więcej niż jednej instrukcji CPU, aby wykonać operację. Na przykład operacja dodawania doda komponenty niskiego rzędu (niskie słowa) wartości long long
, a następnie podejmie operację dodawania i doda ją do operacji dodawania dla słów o wysokim priorytecie long long
.
więc następujący kod C:
long long a;
long long b;
long long c;
// ...
c = a + b;
może być reprezentowany przez sekwencję instrukcji, która wygląda mniej więcej tak:
mov eax, [a.low] ; add the low order words
add eax, [b.low]
mov edx, [a.high] ; add the high order words,
adc edx, [b.high] ; including the carry
mov [c.low], eax
mov [c.high], edx
A jeśli wziąć pod uwagę przez chwilę, kompilatory dla 8 i 16 bitów systemy musiały robić tego typu rzeczy dla wartości 16 i/lub 32-bitowych na długo przed powstaniem long long
.
Najprawdopodobniej jako klasa, nie w sposób natywny. w ten sam sposób jakikolwiek kompilator może/może obsługiwać dowolny zestaw dużych liczb.
Wewnętrznie typ reprezentowany jest przez wysokiej słowem i niskiej słowa, jak:
struct long
{
int32 highWord;
uint32_t lowWord;
}
Kompilator musi wiedzieć, czy jest to środowisko 32-bitowe lub 64-bitowe, a następnie dobiera odpowiednie reprenstations z liczba - jeśli jest 64-bitowa, może być wykonana natywnie, jeśli jest 32-bitowa, kompilator musi zająć się matematyką pomiędzy high/lowword.
Jeśli zajrzysz w mat.h, zobaczysz funkcje używane do tego i użyjesz ich sam. Z drugiej strony należy pamiętać o różnicy między little-endian i big-endian (see wiki), użycie zależy od systemu operacyjnego.
Mówiąc, że architektura ma 32 bity (lub 64 lub cokolwiek innego) jest zwykle tylko przybliżeniem tego, do czego zdolny jest procesor. Zwykle odnosisz się tylko do szerokości wskaźników z tą liczbą, arytmetyka może być całkiem inna. Np. Architektura x86 ma wskaźniki 32-bitowe, większość arytmetyki jest wykonywana w rejestrach 32-bitowych, ale ma również natywną obsługę niektórych podstawowych operacji 64-bitowych.
Nie powinieneś również mieć wrażenia, że standardowe typy liczb całkowitych mają określoną szerokość. W szczególności długi long jest co najmniej 64-bitowy, ale może być szerszy. Użyj typedefs int32_t, int64_t, jeśli chcesz mieć pewność co do szerokości.
Jeśli chcesz wiedzieć, jakie gcc (lub inny kompilator) robi z długo długo trzeba zajrzeć do specyfikacji dla danej platformy docelowej
to dość łatwe po prostu skompilować i przetestować, jeśli masz dostępny system 32-bitowy. gcc ma flagę -S
, która włącza wyjście asemblerowe. Oto, co produkuje na moim 32-bitowym intel:
// read two long longs from stack into eax:edx and ecx:ebx
movl 32(%esp), %eax
movl 36(%esp), %edx
movl 24(%esp), %ecx
movl 28(%esp), %ebx
// a+b
addl %ecx, %eax
adcl %ebx, %edx
// a-b
subl %ecx, %eax
sbbl %ebx, %edx
// etc
- 1. Czy mogę zamienić długi na int?
- 2. Java: Długi wynik = -1: nie można przekonwertować z int na długi
- 3. Konwersja IPv6 na długi i długi na IPv6
- 4. Jak przekonwertować ciąg na długi
- 5. Process.WaitForExit niespójne na różnych komputerach
- 6. C - Konwersja int długi ciąg szesnastkowy do podpisanego
- 7. Dlaczego java.util.zip.CRC32.getValue() zwraca długi, a nie int?
- 8. Konwertuj szesnastkowy łańcuch na długi
- 9. Jak przekonwertować bajt na długi w Javie?
- 10. Jak skalować MySQL na wielu komputerach?
- 11. Mechanizm blokujący proces na wielu komputerach
- 12. Zarządzanie plikami konfiguracji użytkownika na wielu komputerach
- 13. Współpraca projektów Android Studio na wielu komputerach
- 14. WPF: Zwiększanie wydajności pracy na starszych komputerach
- 15. Czy ProtectedData działa na wielu komputerach?
- 16. Zmodyfikuj szablon szablonu C++ na "długi T"?
- 17. Jak przekonwertować int * na int
- 18. NET Bitmap.Load metoda produkować inny wynik na różnych komputerach
- 19. unsigned długi długi konflikt z uint64_t?
- 20. Prosty klient rozgłaszania UDP i serwer na różnych komputerach
- 21. Jak określić długi dotyk na Androidzie?
- 22. Python - Długi ciąg na wielu liniach
- 23. Konwertowanie ciągu znaków dziesiętnych na długi
- 24. Dzielenie długi ciąg na mniejsze ciągi
- 25. Jak złamać długi ciąg na wielu liniach
- 26. Przekształcanie danych.frame z szerokiego na długi format
- 27. Konwertuj IEnumerable <int> na int []
- 28. Konwertuj ciąg na Int bez int()
- 29. Jak wstawić długi tekst?
- 30. Linq int na ciąg
Dwie dodatkowe rzeczy: po pierwsze, kolejność tej struktury zależy od zamówienia urządzenia. – Joshua
Po drugie, wywołania funkcji, które działają na tej strukturze, są dostępne dla ciebie. Są one zadeklarowane w matematyce.h. – Joshua
thirs "lowByte" będzie naprawdę "uint32_t' :-P –