2009-03-16 28 views
40

Khi tôi thực hiện sizeof(int) trong dự án C# .NET của tôi, tôi nhận được giá trị trả về là 4. Tôi đặt loại dự án thành x64, vậy tại sao nó nói 4 thay vì 8? Đây có phải là vì tôi đang chạy mã được quản lý không?sizeof (int) trên x64?

+3

Mã không được quản lý đưa ra quyết định tương tự như .NET. Trong đồng bằng C++, sizeof (int) là 4 là tốt. Hãy nghĩ x64 là phần mở rộng cho kiến ​​trúc 32 bit. Mặc định vẫn là 32, bạn chỉ có khả năng xử lý dữ liệu 64 bit * *. – jalf

+1

@jalf chính xác hơn, chúng tôi đã có khả năng xử lý dữ liệu 64 bit, tuy nhiên CPU x64 làm nhanh hơn do hỗ trợ gốc. –

+2

Tại sao điều này đóng lại? Trong khi về mặt kỹ thuật giống nhau, câu hỏi khác là về Java, đây là về .NET/C#. –

Trả lời

36

various 64-bit data models; Microsoft sử dụng LP64 cho .NET: cả hai chiều dài dài và con trỏ là 64 bit (mặc dù con trỏ kiểu C truyền thống không tồn tại .NET). Tương phản với ILP64 trong đó int cũng là 64 bit.

Do đó, trên tất cả các nền tảng, int là 32 bit và long là 64 bit; bạn có thể thấy điều này trong tên của các loại cơ bản System.Int32System.Int64.

+7

Bạn nên chỉnh sửa câu trả lời của mình vì câu trả lời được chấp nhận để làm cho câu trả lời hoàn toàn chính xác. Loại bỏ nơi bạn nói "mặc dù con trỏ kiểu C truyền thống không tồn tại .NET" và chi tiết System.IntPtr phụ thuộc vào kiến ​​trúc. –

+1

Bạn có thể sử dụng con trỏ "kiểu C" trong C#, chúng chỉ cần được thực hiện trong bối cảnh không an toàn.Giống như "fnieto", bạn cần lưu ý rằng IntPtr phụ thuộc vào nền tảng, trong đó "sizeof (IntPtr) == 4" trong x86 & "sizeof (IntPtr) == 8" in x64. – zezba9000

45

Từ khóa int bí danh System.Int32 vẫn yêu cầu 4 byte, ngay cả trên máy 64 bit.

24

int có nghĩa là Int32 bằng ngôn ngữ .NET. Điều này được thực hiện cho khả năng tương thích giữa kiến ​​trúc 32 và 64 bit.

Đây là số table of all the types trong C# và những gì chúng ánh xạ tới .NET khôn ngoan.

4

Hãy nhớ int chỉ là bí danh trình biên dịch cho loại cơ bản Int32. Do đó, rõ ràng lý do tại sao int chỉ là 32 bit trên nền tảng 64 bit.

12

Bạn có thể nghĩ đến con trỏ int hoặc System.IntPtr. Điều này sẽ là 8 byte trên x64 và 4 byte trên x86. Kích thước của một con trỏ cho thấy rằng bạn có địa chỉ 64 bit cho bộ nhớ của mình. (System.IntPtr.Size == 8 trên x64)

Ý nghĩa của int vẫn là 4 byte dù bạn đang ở trên x86 hay x64. Tức là, int sẽ luôn tương ứng với System.Int32.

14

An Int32 là 4 byte trên x86 và x64. An Int64 là 8 byte hoặc là trường hợp. Loại C# int chỉ là bí danh cho System.Int32. Tương tự trong cả hai môi trường thời gian chạy. Các loại duy nhất mà không thay đổi tùy thuộc vào môi trường thời gian chạy là một IntPtr:

unsafe 
    { 
     var size = sizeof(IntPtr); // 4 on x86 bit machines. 8 on x64 
    } 
+4

Hoặc bạn chỉ có thể kiểm tra IntPtr.Size, không yêu cầu mã không an toàn. –

+0

... và UIntPtr, tất nhiên. ... và các loại con trỏ không an toàn. –

+0

Điều cần lưu ý: UIntPtr không phải là CLS-Compliant. –

2
int i; 
int size = BitConverter.GetBytes(i).Lenght; 
+3

Câu hỏi này được hỏi 3 năm trước và đã có câu trả lời được chấp nhận. Xem liệu bạn có thể cung cấp câu trả lời cho các câu hỏi gần đây chưa có câu trả lời được chấp nhận hay không. – mcknz

+1

Tôi đoán nó được dành cho vì "Chiều dài", rõ ràng – Laie

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