câu hỏi rất đơn giản, tôi đọc rằng GCC hỗ trợ loại dài int dài. Nhưng làm thế nào có thể làm cho hoạt động toán học với nó, khi CPU là 32 bit chỉ rộng?Dài dài int trên máy 32 bit
Trả lời
Trình biên dịch sẽ tổng hợp các phép toán (hoặc sử dụng các cuộc gọi hàm) sử dụng nhiều hơn một lệnh CPU để thực hiện thao tác. Ví dụ, một hoạt động bổ sung sẽ thêm các thành phần thứ tự thấp (các từ thấp) của các giá trị long long
và sau đó sẽ thực hiện thao tác đó và đưa nó vào hoạt động thêm vào các từ thứ tự cao của long long
.
Vì vậy, mã C sau:
long long a;
long long b;
long long c;
// ...
c = a + b;
có thể được đại diện bởi một dãy lệnh trông giống như sau:
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
Và nếu bạn xem xét một lát, trình biên dịch cho 8 và 16 bit hệ thống đã phải làm loại điều này cho 16 và/hoặc 32-bit giá trị dài trước khi long long
ra đời.
Rất có thể là một lớp học, không phải là nguyên bản. cùng một cách bất kỳ trình biên dịch có thể/có thể hỗ trợ bất kỳ tập hợp số lượng lớn.
Bên trong, loại được đại diện bởi một chữ cao và một chữ thấp, như:
struct long
{
int32 highWord;
uint32_t lowWord;
}
Trình biên dịch cần phải biết nếu nó là một 32bit hoặc 64bit môi trường và sau đó chọn reprenstations bên phải của số - nếu nó là 64bit, nó có thể được thực hiện tự nhiên, nếu nó là 32 bit, trình biên dịch phải chăm sóc toán học giữa từ cao/lowword.
Nếu bạn có một cái nhìn trong math.h, bạn có thể thấy các chức năng được sử dụng cho điều này, và sử dụng chúng cho mình. Trên một lưu ý bổ sung, nhận thức được sự khác biệt giữa nhỏ và cuối lớn (see wiki), việc sử dụng phụ thuộc vào hệ điều hành.
Nói kiến trúc là 32 bit (hoặc 64 hoặc bất kỳ thứ gì) thường chỉ là xấp xỉ về những gì mà bộ xử lý có khả năng. Thông thường, bạn chỉ đề cập đến chiều rộng của con trỏ với con số đó, số học có thể khá khác nhau. Ví dụ: kiến trúc x86 có con trỏ 32 bit, hầu hết số học được thực hiện trong thanh ghi 32 bit, nhưng nó cũng có hỗ trợ riêng cho một số thao tác cơ bản 64 bit.
Ngoài ra, bạn không nên theo dõi hiển thị rằng các loại số nguyên chuẩn có một số chiều rộng được chỉ định. Đặc biệt dài lâu ít nhất là 64 bit nhưng có thể rộng hơn. Sử dụng typedefs int32_t, int64_t nếu bạn muốn chắc chắn về chiều rộng.
Nếu bạn muốn biết những gì gcc (hoặc bất kỳ trình biên dịch khác) thực hiện với lâu dài, bạn phải nhìn vào thông số kỹ thuật cho nền tảng mục tiêu cụ thể của bạn
Thật dễ dàng đủ để chỉ cần biên dịch và kiểm tra nếu bạn có một hệ thống 32 bit có thể truy cập được. gcc có cờ -S
sẽ bật đầu ra ngôn ngữ lắp ráp. Dưới đây là những gì nó tạo ra trên intel 32 bit của tôi:
// 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. 32 bit int * 32 bit int = 64 bit int?
- 2. thực hiện lâu dài trong máy 32 bit
- 3. C++ int so với dài
- 4. __int64 trên máy 32 bit?
- 5. Nhân hai số int dài dài C
- 6. Độ dài của các bit được sử dụng trong int
- 7. PHP json_decode trên máy chủ 32 bit
- 8. Có u_int64_t trên máy 32 bit không?
- 9. JavaScript: Thay đổi bit theo chiều dài số dài
- 10. chạy nhị phân 32 bit trên máy 64 bit
- 11. Chạy dll 32 bit trên máy 64 bit trong java
- 12. Làm cách nào để bit chuyển đổi dài hơn 32 bit?
- 13. sizeof (dài) trong 64-bit C++
- 14. Kích thước bit dài trên Windows 64 bit là bao nhiêu?
- 15. jQuery và dài int id
- 16. Confused bởi "... kéo dài Function1 [Int, Int]"
- 17. Chuyển đổi số nguyên không dấu 32 bit (lớn cuối) thành dài và quay lại
- 18. sự khác biệt giữa lâu dài và dài int
- 19. Máy ảo 32 hoặc 64 bit nhanh hơn trên máy 64 bit (vmware)
- 20. Chiều dài dữ liệu so với chiều dài CRC
- 21. Tạo 32 bit JavaFX Native Bundle trong máy 64 bit
- 22. Có lâu luôn 64 bit trong cả máy 32 và 64 bit
- 23. Java số học int so với dài
- 24. Windows Phone 8 SDK có thể được cài đặt trên máy tính Windows 32 32 bit
- 25. QtCreator trên linux: 32 bit so với 64 bit
- 26. Hoạt động trên 64 bit hoạt động trong kiến trúc 32 bit?
- 27. Sử dụng int dài trong PHP
- 28. tìm ra "chuỗi dài" của một int
- 29. Java lưu trữ hai int trong một thời gian dài
- 30. Khả năng truy cập Java 32 bit trên máy 64 bit
Hai thứ bổ sung: thứ nhất, thứ tự cấu trúc này phụ thuộc vào thứ tự máy. – Joshua
Thứ hai, các cuộc gọi hàm hoạt động trên cấu trúc này có sẵn cho bạn. Chúng được khai báo trong math.h. – Joshua
thirs 'lowByte' sẽ thực sự là' uint32_t' :-P –