Tại sao ngắn, int và dài được phát minh trong C?


16

Tôi đang gặp rắc rối hiểu biết, mục đích chính xác của việc tạo ra là gì short, intlongcác kiểu dữ liệu trong C?

Lý do tôi hỏi là, có vẻ như kích thước của chúng không bị giới hạn - chẳng hạn, chúng có thể có kích thước bất kỳ, miễn shortlà nhỏ hơn một intví dụ.

Trong trường hợp nào, sau đó, bạn nên sử dụng một unsigned inthoặc unsigned long, ví dụ, thay vì a size_t, khi làm như vậy không mang lại hy vọng tương thích nhị phân?

(Nếu bạn không biết kích thước, thì làm sao bạn biết khi nào nên chọn cái nào?)


2
Kiểm tra<stdint.h>
BlackJack

1
@BlackJack: Haha vâng tôi thực sự có - nhưng tôi đoán câu hỏi của tôi là, tại sao không phải tất cả các loại được xác định nguyên bản thay thế? Đây có phải là vấn đề "nhận thức muộn màng là 20/20" không, hay có một lý do cụ thể nào không?
Mehrdad

2
C có nghĩa là cả di động và gần với phần cứng cơ bản. Có những nền tảng mà byte không dài 8 bit - nhưng bạn vẫn có thể sử dụng C. Không có bộ dữ liệu cố định nào là đủ, không có tích phân kích thước cố định nào có thể di động được.
SK-logic

@ SK-logic: Ngay cả khi họ nói sizeof(short) == 2 * sizeof(char)hoặc tương tự?
Mehrdad

1
Có nền tảng ở đó sizeof(char) == sizeof(short), và nó có ý nghĩa. Thật không may, không có cách nào để chỉ định các loại số nguyên theo cách chúng sẽ phù hợp với tất cả các nền tảng có thể và hiện có.
SK-logic

Câu trả lời:


12

Nó được xác định bởi kiến ​​trúc bạn đang sử dụng. Trên chip Zilog z80 (chip nhúng phổ biến), chúng có một kích thước trong khi chúng có thể là một kích thước hoàn toàn khác trên chipset x86. Tuy nhiên, kích thước bản thân là tỷ lệ cố định với nhau. Về cơ bản, các loại không ngắn và dài nhưng đủ điều kiện cho loại int. Số nguyên ngắn sẽ là một bậc có độ lớn nhỏ hơn số nguyên (thông thường) và số nguyên dài sẽ là một bậc có độ lớn cao hơn. Vì vậy, giả sử Int của bạn được giới hạn ở 4 byte, vòng loại ngắn giới hạn ở mức 4 byte mặc dù 2 byte cũng rất phổ biến và vòng loại dài tăng khả năng lên 8 byte mặc dù có thể giảm xuống còn 4 byte. Hãy nhớ rằng điều này cũng phụ thuộc vào độ dài từ, vì vậy trên hệ thống 32 bit, bạn sẽ đạt tối đa 4 byte cho mỗi int dù sao cũng dài như một int thông thường. Do đó, Short Int Long.

Tuy nhiên, nếu bạn kéo dài nó một lần nữa, bạn có thể đẩy int vào ô tiếp theo cung cấp cho bạn 8 byte lưu trữ. Đây là kích thước từ cho các máy 64 bit, vì vậy họ không phải lo lắng về những điều như vậy và chỉ cần sử dụng một ô cho các int dài cho phép chúng là một thứ tự khác trên ints tiêu chuẩn trong khi các int dài dài thực sự có được một chút.

Theo như lựa chọn, nó sẽ hiểu rõ điều gì đó mà các lập trình viên Java không phải lo lắng. "Kiến trúc của bạn là gì?" Vì tất cả phụ thuộc vào kích thước từ của bộ nhớ của máy đang được đề cập, bạn phải hiểu điều đó trước khi bạn quyết định sử dụng. Sau đó, bạn chọn kích thước hợp lý nhỏ nhất để tiết kiệm bộ nhớ nhất có thể vì bộ nhớ đó sẽ được phân bổ cho dù bạn có sử dụng tất cả các bit trong đó hay không. Vì vậy, bạn lưu nơi bạn có thể và chọn quần short khi bạn có thể và ints khi bạn không thể và nếu bạn cần thứ gì đó lớn hơn những gì thông thường bạn cung cấp; bạn sẽ kéo dài khi cần thiết cho đến khi bạn chạm trần. Sau đó, bạn cần cung cấp các thói quen số lượng lớn hoặc lấy chúng từ thư viện.

C cũng có thể là "lắp ráp di động" nhưng bạn vẫn phải biết phần cứng.


11
Điều này không hoàn toàn đúng, quần short không phải nhỏ hơn ints, chúng không thể lớn hơn ints
jk.

Tôi sẽ sửa nó.
Kỹ sư thế giới

2
Tương tự, longs không thể nhỏ hơn ints.
Donal Fellows

1
thực sự tôi tin rằng đã có những cỗ máy ngắn, int và dài giống hệt nhau.
jk.

6

Mặc dù ngày nay, "byte" có nghĩa là "8 bit", điều đó không phải lúc nào cũng đúng. Các máy đã sử dụng các khối địa chỉ gồm 4 bit, 8 bit, 12 bit, 16 bit, 32 bit và 36 bit (và có thể cả một số kích thước khác nữa). Một trong những ý định thiết kế của C là có thể sử dụng được trên các máy có kích thước và cấu hình bộ nhớ khác nhau.

Tôi nghĩ rằng mục đích thiết kế ban đầu là mỗi loại không intphải là thứ nhỏ nhất có thể xử lý số lượng kích cỡ khác nhau và đó intlà kích thước "mục đích chung" thực tế nhất có thể xử lý +/- 32767. Tôi không nghĩ rằng có bất kỳ mong muốn hoặc ý định tạo ra một ngôn ngữ vẫn sẽ được sử dụng khi máy tính trở nên mạnh mẽ đến mức các hoạt động trên các số 64 bit có giá tương đương với các hoạt động trên các ngôn ngữ nhỏ hơn.

Vấn đề lớn nhất với ngữ nghĩa kiểu số nguyên của C là trong một số ngữ cảnh, chúng đại diện cho các số chính hoặc số nguyên toán học, trong khi trong các bối cảnh khác, chúng được sử dụng để đại diện cho các thành phần của một số nguyên đại số trừu tượng bao gồm mod 2 ^ n [ví dụ: trừ giá trị đại diện tối đa từ 0 được xác định để mang lại 1], nhưng các hành vi được chỉ định nhiều hơn trên cơ sở trình biên dịch dường như thực hiện những ngày khi kích thước từ máy tính là khoảng 16 bit (và kích thước từ 36 bit sẽ rất lớn ), thay vì dựa trên những gì có ý nghĩa trên máy 64 bit. Do đó, kết quả của việc trừ giá trị không dấu 32 bit khỏi giá trị 32 bit không dấu nhỏ hơn có thể là giá trị không dấu 32 bit lớn hoặc số 64 bit âm.


4

/programming/589575/size-of-int-long-etc

Vì vậy, trong các kiến ​​trúc được sử dụng phổ biến nhất, char là 1 byte, ngắn và int có ít nhất 2 byte và dài ít nhất là 4 byte.

Và nó dự định rằng 'int' sẽ là đại diện tự nhiên / bình thường / hiệu quả nhất cho CPU hiện tại.

Vì vậy, quy tắc chung là sử dụng 'int' trừ khi giá trị của bạn vượt quá +/- 32K, khiến bạn (trên các CPU cũ hơn) sử dụng 'dài'. ... hoặc trừ khi bạn tạo ra một mảng lớn các giá trị nhỏ (<32K) và bộ nhớ là một vấn đề - vì vậy bạn sẽ sử dụng 'short' để lưu bộ nhớ (hoặc có thể là 'char' hoặc 'byte').


2
Nhưng với 64-bit, inthầu như không phải là một lựa chọn tốt, phải không? Tôi hầu như luôn luôn kết thúc bằng cách sử dụng size_t(hoặc thậm chí ptrdiff_t!) Để tránh các vấn đề với mã chuyển.
Mehrdad

@Merhdad - int được sử dụng cho sự lựa chọn tốt nhất, nó được coi là 'đơn vị tiêu chuẩn' của CTNH, và thường là kích thước của một con trỏ. Ngày nay sử dụng size_t cho an toàn.
Martin Beckett

1

C được thiết kế để chủ động đối phó với bộ nhớ ở các cấp độ khác nhau. Có những trường hợp sự khác biệt giữa ngắn, int và dài và giữa float và double, quan trọng là do các hạn chế về bộ nhớ, kiến ​​trúc, v.v. Mặc dù bây giờ nó ít quan trọng hơn, nhưng vẫn có những môi trường mà nó (ví dụ, được nhúng và trong trường hợp dữ liệu rất lớn) và việc chuyển đổi từ kiến ​​trúc chủ yếu 32 bit sang 64 bit khiến nó trở thành vấn đề một lần nữa. (Trong mười hoặc hai mươi năm khi chúng tôi chuyển sang kiến ​​trúc 128 bit và C / C ++ vẫn còn phổ biến, nó sẽ lại là một vấn đề). Bạn đúng mặc dù khả năng tương thích nhị phân bị ảnh hưởng, đó là lý do tại sao bạn không muốn sử dụng các kích thước loại biến này khi điều đó quan trọng.

Bạn đã hỏi làm thế nào bạn sẽ biết nên sử dụng cái nào nếu bạn không biết kích thước, nhưng bạn biết kích thước trên một tổ hợp kiến ​​trúc / trình biên dịch nhất định và nếu bạn cần tối ưu hóa bộ nhớ ở mức đó, bạn sẽ biết rõ hơn về nó. Bạn không thể tối ưu hóa nó đơn giản trên các nền tảng vì bạn không thể biết kích thước của chúng, vì vậy bạn sẽ không muốn sử dụng các tính năng đó cho mục đích đó. Nhưng rất nhiều thứ được viết bằng C là dành riêng cho nền tảng, mặc dù thời trang cho "đa nền tảng", cho phép một số tối ưu hóa có lợi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.