2009-07-23 10 views
6

Kiểu dữ liệu "int" tương thích trong C++ có thể tự thay đổi kích thước thành 4 byte trên 32bit & 8 byte trên cửa sổ 64 bit?Loại "int" tương thích trong cả hai cửa sổ 32Bit & 64Bit trong C++ là gì?

Mặc dù INT_PTR hoạt động tốt nhưng nó làm giảm khả năng đọc cũng như mô tả của nó cho chúng tôi sử dụng nó cho số học con trỏ.

Cảm ơn

+0

Tôi nghĩ vấn đề là theo chiều ngược lại - rằng bạn cần một kiểu dữ liệu mà không thay đổi kích thước. Với các kiểu dữ liệu thay đổi kích cỡ, bạn có vấn đề là mã có thể chạy trên một hệ thống và không phải trên một hệ thống khác. –

+0

* int * thường là loại tích phân nhanh nhất của nền tảng. Nếu bạn cần điều này để đếm trong một vòng lặp ví dụ, chỉ cần sử dụng * int * và để cho trình biên dịch làm các thủ đoạn bẩn cho bạn. –

Trả lời

3

Nếu bạn đang tìm kiếm thứ gì đó chuẩn, bạn sẽ không may mắn. Tiêu chuẩn không chỉ định kích thước của bất kỳ kiểu dữ liệu dựng sẵn nào.

Lưu ý rằng INT_PTR không hàm ý số học con trỏ. Tôi có nghĩa là loại sẽ có cùng kích thước với tên là void *, chính xác là những gì bạn muốn. Nó sẽ không hoạt động trên tất cả các nền tảng mặc dù (tôi khá chắc chắn đó là Windows cụ thể).

1

Nó thực sự phụ thuộc vào trình biên dịch. Tôi nghĩ rằng cách duy nhất (nhiều hơn hoặc ít hơn) đáng tin cậy là sử dụng một loại con trỏ như (void *).

Tôi nghĩ rằng cách tốt nhất là bằng cách sử dụng một số chế biến có điều kiện trong tập tin tiêu đề của bạn và thiết lập một kiểu tùy chỉnh:

#ifdef _WIN64 
    typedef __int64 NATIVEINT; 
#else 
    typedef __int32 NATIVEINT; 
#endif 

(mẫu này là dành cho Visual C++)

3

Tiêu chuẩn không đề cập đến các yêu cầu kích thước cụ thể, chỉ mỗi loại không thể tách rời phải cung cấp ít nhất là bộ nhớ nhiều như loại trước đó. Vì vậy, int phải giữ nhiều nhất là short, v.v. Bạn nên ngừng xác định những gì bạn cần chúng.

Nếu bạn đang tìm kiếm số nguyên không thay đổi kích thước dựa trên môi trường hoạt động, hãy xem Boost Integer Library hoặc tiêu đề C99/C++ 11 <cstdint>. Điều này chứa các loại như uint32_t/int32_tuintmax_t/intmax_t.

Quan trọng nhất, dựa trên câu hỏi của bạn, nó có: uintptr_t/intptr_t. Chúng được đảm bảo có kích thước chính xác để giữ con trỏ trên nền tảng của bạn.

+0

'đã ký size_t'? Có lẽ bạn có nghĩa là 'ssize_t' của gcc? :) – avakar

+0

@avakar: (Gần ba năm sau ...) Đã sửa. :-) – GManNickG

3

dưới Visual Studio bạn cũng được cung cấp __int3264 mà còn có nhiều chức giống như INT_PTR ...

+0

Tôi chỉ cần thêm một lol vào đó. __int3264. nào. –