2010-06-18 39 views

Trả lời

20

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.

1

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.

9

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.

+1

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

+0

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

+0

thirs 'lowByte' sẽ thực sự là' uint32_t' :-P –

2

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

2

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 
Các vấn đề liên quan