Có một biến Integer trong C chiếm 2 byte hoặc 4 byte không?
Điều đó phụ thuộc vào nền tảng bạn đang sử dụng, cũng như cách trình biên dịch của bạn được cấu hình. Câu trả lời có thẩm quyền duy nhất là sử dụng sizeof
toán tử để xem số nguyên lớn như thế nào trong tình huống cụ thể của bạn.
Các yếu tố mà nó phụ thuộc vào là gì?
Phạm vi có thể được xem xét tốt nhất, thay vì kích thước . Cả hai sẽ khác nhau trong thực tế, mặc dù việc lựa chọn các loại biến theo phạm vi so với kích thước như chúng ta sẽ thấy sẽ khó hơn nhiều. Cũng cần lưu ý rằng tiêu chuẩn khuyến khích chúng ta xem xét lựa chọn các loại số nguyên dựa trên phạm vi thay vì kích thước , nhưng bây giờ chúng ta hãy bỏ qua thực tiễn tiêu chuẩn và để sự tò mò khám phá sizeof
, byte và CHAR_BIT
và biểu diễn số nguyên ... hãy bỏ qua lỗ thỏ và nhìn thấy nó cho chính chúng ta ...
sizeof
, byte và CHAR_BIT
Tuyên bố sau đây, được lấy từ tiêu chuẩn C (được liên kết đến ở trên), mô tả điều này bằng những từ mà tôi không nghĩ có thể được cải thiện.
Các sizeof
nhà điều hành mang lại kích thước (tính theo byte) của toán hạng của nó, có thể là một biểu thức hoặc tên trong ngoặc của một loại. Kích thước được xác định từ loại toán hạng.
Giả sử một sự hiểu biết rõ ràng sẽ dẫn chúng ta đến một cuộc thảo luận về byte . Người ta thường cho rằng một byte là tám bit, trong khi thực tế CHAR_BIT
cho bạn biết có bao nhiêu bit trong một byte . Đó chỉ là một trong những sắc thái không được xem xét khi nói về hai số nguyên byte (hoặc bốn) chung .
Chúng ta hãy kết thúc mọi thứ cho đến nay:
sizeof
=> kích thước tính theo byte và
CHAR_BIT
=> số bit theo byte
Do đó, tùy thuộc vào hệ thống của bạn, sizeof (unsigned int)
có thể là bất kỳ giá trị nào lớn hơn 0 (không chỉ 2 hoặc 4), như thể CHAR_BIT
là 16, sau đó một byte (mười sáu bit) có đủ bit để biểu thị số nguyên mười sáu bit được mô tả bởi tiêu chuẩn (trích dẫn dưới đây). Đó không hẳn là thông tin hữu ích, phải không? Hãy đi sâu hơn ...
Đại diện số nguyên
Tiêu chuẩn C chỉ định độ chính xác / phạm vi tối thiểu cho tất cả các loại số nguyên tiêu chuẩn (và CHAR_BIT
, quá, fwiw) ở đây . Từ điều này, chúng ta có thể rút ra mức tối thiểu cho số lượng bit được yêu cầu để lưu trữ giá trị , nhưng chúng ta cũng có thể chỉ chọn các biến dựa trên phạm vi . Tuy nhiên, một phần rất lớn của chi tiết cần thiết cho câu trả lời này nằm ở đây. Ví dụ: các tiêu chuẩn sau đây unsigned int
yêu cầu (ít nhất) mười sáu bit lưu trữ:
UINT_MAX 65535 // 2¹⁶ - 1
Do đó, chúng ta có thể thấy unsigned int
yêu cầu ( ít nhất ) 16 bit , đó là nơi bạn nhận được hai byte (giả sử CHAR_BIT
là 8) ... và sau đó khi giới hạn đó tăng lên 2³² - 1
, mọi người thay vào đó là 4 byte. Điều này giải thích các hiện tượng bạn quan sát thấy:
Hầu hết các sách giáo khoa nói rằng các biến số nguyên chiếm 2 byte. Nhưng khi tôi chạy một chương trình in các địa chỉ liên tiếp của một mảng các số nguyên thì nó cho thấy sự khác biệt của 4.
Bạn đang sử dụng một cuốn sách giáo khoa và trình biên dịch cổ xưa đang dạy cho bạn C không di động; tác giả đã viết sách giáo khoa của bạn thậm chí có thể không nhận thức được CHAR_BIT
. Bạn nên nâng cấp sách giáo khoa (và trình biên dịch) và cố gắng nhớ rằng CNTT là một lĩnh vực không ngừng phát triển mà bạn cần đi trước để cạnh tranh ... Mặc dù vậy, đủ về điều đó; chúng ta hãy xem những bí mật không thể di động nào khác mà các byte nguyên nằm bên dưới lưu trữ ...
Các bit giá trị là những gì các quan niệm sai lầm phổ biến dường như được tính. Ví dụ trên sử dụng một unsigned
loại số nguyên thường chỉ chứa các bit giá trị, vì vậy rất dễ bỏ lỡ ma quỷ trong chi tiết.
Ký hiệu bit ... Trong ví dụ trên tôi đã trích dẫn UINT_MAX
là giới hạn trên unsigned int
vì đó là một ví dụ tầm thường để trích xuất giá trị 16
từ nhận xét. Đối với các loại đã ký, để phân biệt giá trị dương và âm (đó là dấu hiệu), chúng ta cũng cần bao gồm bit dấu.
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
Các bit đệm ... Mặc dù không phổ biến khi gặp các máy tính có các bit đệm trong các số nguyên, tiêu chuẩn C cho phép điều đó xảy ra; một số máy (nghĩa là máy này ) triển khai các loại số nguyên lớn hơn bằng cách kết hợp hai giá trị số nguyên nhỏ hơn (đã ký) với nhau ... và khi bạn kết hợp các số nguyên đã ký, bạn sẽ nhận được một bit dấu lãng phí. Bit bị lãng phí đó được coi là phần đệm trong C. Các ví dụ khác về bit đệm có thể bao gồm bit chẵn lẻ và bit bẫy .
Như bạn có thể thấy, tiêu chuẩn dường như khuyến khích việc xem xét các phạm vi như INT_MIN
.. INT_MAX
và các giá trị tối thiểu / tối đa khác từ tiêu chuẩn khi chọn loại số nguyên và không khuyến khích dựa vào kích thước vì có các yếu tố tinh tế khác có thể bị lãng quên như CHAR_BIT
và các bit đệm có thể ảnh hưởng đến giá trị của sizeof (int)
(nghĩa là các quan niệm sai lầm phổ biến về số nguyên hai byte và bốn byte bỏ qua các chi tiết này).