2008-12-01 27 views
17

Theo tiêu chuẩn c99, kích thước của long long phải tối thiểu 64 bit. Làm thế nào điều này được thực hiện trong một máy 32 bit (ví dụ: bổ sung hoặc nhâns). Ngoài ra, Tương đương với long long bằng C++ là gì.thực hiện lâu dài trong máy 32 bit

+0

Máy 8 và 16 bit cũng được quản lý để xử lý các biến lớn hơn "bit xử lý" của chúng. Nhiều câu hỏi đã được trả lời bởi lịch sử. –

Trả lời

8

Trên kiến ​​trúc IA32, số nguyên 64 bit được thực hiện bằng cách sử dụng hai thanh ghi 32 bit (eax và edx).

Có nền tảng tương đương cụ thể cho C++ và bạn có thể sử dụng tiêu đề stdint.h nếu có (tăng cung cấp cho bạn one).

2

Nếu bạn quan tâm đến bit kích cỡ, bạn nên sử dụng

#include <stdint.h> 

int32_t n; 

và bạn bè. Điều này làm việc cho C++ là tốt.

Số 64 bit trên máy 32 bit được triển khai như bạn nghĩ, thêm 4 byte. Do đó bạn có thể thực hiện riêng 64-bit datatype của bạn bằng cách làm một cái gì đó như thế này:

struct my_64bit_integer { 
    uint32_t low; 
    uint32_t high; 
}; 

Bạn sẽ đương nhiên phải thực hiện khai thác toán học cho mình.

Có một int64_t trong stdint.h đi kèm với phiên bản GCC của tôi, và trong Microsoft Visual C++ bạn cũng có loại __int64.

14

Tương đương trong C++ cũng dài. Nó không được yêu cầu bởi tiêu chuẩn, nhưng hầu hết các trình biên dịch hỗ trợ nó bởi vì nó rất hữu ích.

Làm cách nào để triển khai? Hầu hết các kiến ​​trúc máy tính đã có sẵn hỗ trợ cho các phép cộng và trừ nhiều từ. Họ không làm trực tiếp 64 bit addititions nhưng sử dụng cờ carry và một add-instruction đặc biệt để xây dựng thêm 64 bit từ hai bit 32 bit thêm vào.

Cùng một phần mở rộng tồn tại cho phép trừ (carry được gọi là vay trong những trường hợp này).

Nhân và phép chia dài có thể được tạo từ các phép nhân nhỏ hơn mà không cần sự trợ giúp của cờ mang. Đôi khi chỉ đơn giản là làm các hoạt động từng chút một là nhanh hơn mặc dù.

Có kiến ​​trúc không có bất kỳ cờ nào cả (một số chip DSP và vi đơn giản). Trên các kiến ​​trúc này, tràn phải được phát hiện với các phép toán logic. Số học nhiều từ có xu hướng chậm trên các máy này.

3

Như mọi người đã nêu, một số nguyên 64 bit thường được thực hiện bằng cách sử dụng hai số nguyên 32 bit cùng nhau. Sau đó, tạo mã thông minh được sử dụng để theo dõi các bit carry and/or borrow để theo dõi tràn, và điều chỉnh cho phù hợp. Điều này tất nhiên làm cho số học như vậy tốn kém hơn về không gian mã và thời gian thực hiện, so với cùng một mã được biên dịch cho một kiến ​​trúc với hỗ trợ riêng cho các hoạt động 64-bit.

1

Chuẩn C++ tiếp theo (do năm 2009 hoặc 2010) được dự kiến ​​bao gồm loại "dài". Như đã đề cập trước đó, nó đã được sử dụng phổ biến.

Việc triển khai tùy thuộc vào nhà biên dịch trình biên dịch, mặc dù máy tính luôn hỗ trợ nhiều hoạt động chính xác.Một số ngôn ngữ, như Python và Common Lisp, yêu cầu hỗ trợ cho các số nguyên chính xác không xác định. Cách đây rất lâu, tôi đã viết các phép nhân và phân chia 64 bit cho một máy tính (Z80) có thể quản lý phép cộng và trừ 16 bit, không có phép nhân phần cứng nào cả.

Có lẽ cách dễ nhất để xem cách hoạt động được thực hiện trên trình biên dịch cụ thể của bạn là viết một mẫu mã và kiểm tra đầu ra của trình lắp ráp, có sẵn từ tất cả các trình biên dịch chính mà tôi đã làm việc.

Các vấn đề liên quan