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?
Trả lời
Có 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.Int32 và System.Int64.
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. –
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
Từ khóa int
bí danh System.Int32
vẫn yêu cầu 4 byte, ngay cả trên máy 64 bit.
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.
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.
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
.
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
}
Hoặc bạn chỉ có thể kiểm tra IntPtr.Size, không yêu cầu mã không an toàn. –
... và UIntPtr, tất nhiên. ... và các loại con trỏ không an toàn. –
Điều cần lưu ý: UIntPtr không phải là CLS-Compliant. –
int i;
int size = BitConverter.GetBytes(i).Lenght;
- 1. sizeof (int) == sizeof (void *)?
- 2. Là sizeof (enum) == sizeof (int), luôn luôn?
- 3. Tại sao sizeof (int) khác với sizeof (int *)?
- 4. Tại sao −1> sizeof (int)?
- 5. Điều gì sẽ là sizeof (int) trên một máy tính 64-bit?
- 6. Tại sao "memset (arr, -1, sizeof (arr)/sizeof (int))" không xóa một mảng số nguyên thành -1?
- 7. MSBuild.Community.Tasks.Attrib trên máy x64 không
- 8. Vị trí mới dựa trên mẫu sizeof()
- 9. sizeof() std :: vector (C++)
- 10. sizeof làm gì?
- 11. sizeof chuỗi chữ
- 12. TypeLoadException trên x64 nhưng tốt trên x86 với structlayouts
- 13. Tôi có thể cài đặt cả hai x86/x64 windbg trên x64 WIN7 của mình không?
- 14. sizeof hành xử bất ngờ
- 15. Trong C, tại sao sizeof (char) 1, khi 'a' là int?
- 16. C# sizeof thập phân?
- 17. thực hiện điều hành sizeof
- 18. sizeof mẫu variadic (tổng của sizeof của tất cả các yếu tố)
- 19. C Pointer Arithmetic sizeof (struct)
- 20. sizeof vs strlen
- 21. Tôi có đảm bảo rằng sizeof (loại) == sizeof (loại không dấu) không?
- 22. sizeof() điều hành với nhiều loại
- 23. Đọc 16 byte nguyên tử trên CPU x64
- 24. Entity Framework spinup chậm hơn trên x64 vs x86
- 25. Không có TFS Snapin cho PowerShell trên x64?
- 26. Mod (%) nhà điều hành trên x86 vs x64
- 27. OpenProcess trên hình ảnh x64 từ ứng dụng Win32
- 28. Viết x86 lắp ráp trên bộ xử lý bit x64
- 29. Tại sao IntPtr.size là 4 trên Windows x64?
- 30. Console.WriteLine làm việc trên x86 nhưng không x64
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
@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. –
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#. –