2012-04-17 27 views
45

thể trùng lặp:
size of int, long, etc
Does the size of an int depend on the compiler and/or processor?
What decides the sizeof an integer?Điều gì sẽ là sizeof (int) trên một máy tính 64-bit?

Tôi đang sử dụng một máy 64-bit.

$ uname -m 
x86_64 
$ file /usr/bin/file 
/usr/bin/file: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped 
$ 

Khi tôi chạy chương trình sau, tôi nhận được sizeof(int)4-bytes.

#include <stdio.h> 

int main(void) 
{ 
    printf("sizeof(int) = %d bytes\n", (int) sizeof(int)); 

    return 0; 
} 

Nếu tôi đang chạy một máy 16-, 32-64- chút, sau đó không có nghĩa rằng kích thước của một integer16-, 32-64- chút tương ứng?

Trong máy của tôi, tôi thấy số WORD_BIT32. Không phải là 64 trên máy 64-bit?

$ getconf WORD_BIT 
32 
$ 

Và, nên không phải là sizeof(int) được 64-bits (8 bytes) trong trường hợp trên?

+3

Tôi không phải là người C, nhưng tôi tin rằng kích thước của bất cứ điều gì ngoại trừ 'char' là trình biên dịch cụ thể, và nó cũng không nhất thiết phải là kích thước của một từ trên bộ xử lý. – Ryan

+0

http://stackoverflow.com/questions/589575/size-of-int-long-etc – Perception

+1

@minitech: char cũng là trình biên dịch cụ thể – Dani

Trả lời

35

Không nhất thiết phải; "Máy 64 bit" có thể có nghĩa là nhiều thứ, nhưng thường có nghĩa là CPU có đăng ký lớn. Kích thước của một loại được xác định bởi trình biên dịch, mà không cần phải có bất cứ điều gì để làm với phần cứng thực tế (mặc dù nó thường không); trên thực tế, các trình biên dịch khác nhau trên cùng một máy có thể có các giá trị khác nhau cho chúng.

20

Không thực sự. cho khả năng tương thích ngược, nó là 32 bit.
Nếu bạn muốn 64 bit, bạn có long, size_t hoặc int64_t

+12

'long' là 4 byte trên Windows 64. –

+18

@JonathanLeffler: trên các hệ thống bình thường – Dani

+10

@Dani Có gì bất thường về Windows 64 bit? Linux và Windows chọn triển khai [mô hình dữ liệu] khác nhau (https://en.wikipedia.org/wiki/64-bit#64-bit_data_models) cho việc triển khai 64 bit của chúng, không làm cho cái này bình thường hơn cái kia. – Praetorian

6

Trong C++, kích thước của int không được chỉ định rõ ràng. Nó chỉ cho bạn biết rằng nó phải có kích thước tối thiểu là short int, phải có kích thước tối thiểu là signed char. Kích thước của char theo bit không được chỉ định rõ ràng, mặc dù sizeof (char) được định nghĩa là 1. Nếu bạn muốn int 64 bit, C++ 11 chỉ định long long ít nhất 64 bit.

+1

Nói kích thước của 'char' không được chỉ định rõ ràng là gây hiểu nhầm. 'sizeof (char)' là 1 theo định nghĩa (vì vậy char là một byte). "Kích thước" duy nhất thay đổi là số bit mà nó sử dụng: 'CHAR_BITS', ít nhất là 8. Cũng lưu ý một byte có thể có nhiều hơn 8 bit. – Anthales

+0

Bạn cần tra cứu ngữ nghĩa về toán tử 'sizeof'. Vì tôi không có tài liệu chuẩn C++ nên tôi chỉ có thể nói cho bạn biết C99 phải nói gì về điều này (và tôi biết rằng C++ đồng ý về điều này): "Toán tử' sizeof' tạo ra kích thước (tính theo byte) của toán hạng. " và "Khi được áp dụng cho toán hạng có loại' char', 'unsigned char' hoặc' signed char', (hoặc phiên bản đủ điều kiện), kết quả là 1 " – Anthales

+0

@Anthales bạn hoàn toàn đúng, §5.3.3 trong tiêu chuẩn C++ 11. Cảm ơn bạn đã chỉ ra điều đó. – juanchopanza

48

Kích thước của con trỏ phải là 8 byte trên bất kỳ trình biên dịch C/C++ 64 bit nào, nhưng không nhất thiết là kích thước của int.

+9

Đây là một quan sát quan trọng. Con trỏ trên kiến ​​trúc 32 bit rộng 32 bit, nghĩa là chúng không thể giải quyết nhiều hơn 4GB bộ nhớ. –

+0

Định nghĩa của trình biên dịch 64b là gì? Nếu không gian địa chỉ bị giới hạn đến 4GB, con trỏ 32b sẽ hoạt động tốt. – XTF

+0

@XTF Right và ** x32 ** là một điều thực sự tồn tại: một kiến ​​trúc cho CPU 64 bit nhưng với các con trỏ 32 bit, 'int' và 'long's: https: //wiki.debian .org/X32Port –

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