giá trị tối đa của số nguyên


291

Trong C, số nguyên (đối với máy 32 bit) là 32 bit và nó nằm trong khoảng từ -32,768 đến +32,767. Trong Java, số nguyên (dài) cũng là 32 bit, nhưng nằm trong khoảng từ -2,147,483,648 đến +2,147,483,647.

Tôi không hiểu phạm vi khác nhau như thế nào trong Java, mặc dù số lượng bit là như nhau. Ai đó có thể giải thích điều này?


35
Để có được giá trị tối đa và tối thiểu của int trong Java, hãy sử dụng Integer.MAX_VALUE và Integer.MIN_VALUE
tình yêu trực tiếp

5
@stackuser - Một số câu trả lời hay cho câu hỏi của bạn - bạn nên chấp nhận một câu :)
Darragh Enright

2
@DarraghEnright anh ấy được nhìn thấy lần cuối vào tháng 3 năm 2015, tôi nghi ngờ anh ấy sẽ trở lại :(
Ungeheuer

4
@Adrian haha ​​- Tôi đoán là không! Xảy ra một chút tôi cho rằng. Tôi luôn tưởng tượng rằng SO có thể dễ dàng tự động chấp nhận câu trả lời trong một số điều kiện nhất định - trong đó câu hỏi đã qua một độ tuổi nhất định, OP là AWOL và có một câu trả lời rõ ràng hữu ích với số lượng upvote cao.
Darragh Enright

2
@DarraghEnright Đồng ý. Nhưng OP đã ở đây ~ 2 tuần trước, anh ấy đã có cơ hội chấp nhận, vì vậy về mặt kỹ thuật, anh ấy không rời xa.
gaborsch

Câu trả lời:


392

Trong C , ngôn ngữ tự nó không xác định biểu diễn của các kiểu dữ liệu nhất định. Nó có thể thay đổi từ máy này sang máy khác, trên các hệ thống nhúng intcó thể rộng 16 bit, mặc dù thông thường nó là 32 bit.

Yêu cầu duy nhất là short int<= int<= long inttheo kích thước. Ngoài ra, có một khuyến nghị intnên thể hiện dung lượng riêng của bộ xử lý .

Tất cả các loại được ký kết. Công cụ unsignedsửa đổi cho phép bạn sử dụng bit cao nhất như một phần của giá trị (nếu không nó được dành riêng cho bit dấu).

Dưới đây là bảng ngắn về các giá trị có thể có cho các loại dữ liệu có thể:

          width                     minimum                         maximum
signed    8 bit                        -128                            +127
signed   16 bit                     -32 768                         +32 767
signed   32 bit              -2 147 483 648                  +2 147 483 647
signed   64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807
unsigned  8 bit                           0                            +255
unsigned 16 bit                           0                         +65 535
unsigned 32 bit                           0                  +4 294 967 295
unsigned 64 bit                           0     +18 446 744 073 709 551 615

Trong Java , các ngôn ngữ Java Specification xác định các đại diện của các kiểu dữ liệu.

Thứ tự là: byte8 bit, short16 bit, int32 bit, long64 bit. Tất cả các loại này đã được , không có phiên bản chưa ký. Tuy nhiên, các thao tác bit xử lý các số khi chúng không được ký (nghĩa là xử lý tất cả các bit một cách chính xác).

Kiểu dữ liệu ký tự charrộng 16 bit, không dấu và giữ các ký tự sử dụng mã hóa UTF-16 (tuy nhiên, có thể gán một charsố nguyên 16 bit không dấu tùy ý đại diện cho một mã ký tự không hợp lệ)

          width                     minimum                         maximum

SIGNED
byte:     8 bit                        -128                            +127
short:   16 bit                     -32 768                         +32 767
int:     32 bit              -2 147 483 648                  +2 147 483 647
long:    64 bit  -9 223 372 036 854 775 808      +9 223 372 036 854 775 807

UNSIGNED
char     16 bit                           0                         +65 535

10
Tiêu chuẩn C cũng chỉ định các giá trị tối thiểu cho INT_MAX, LONG_MAX, v.v.
Oliver Charlesworth

13
Java 8 hiện cũng có Số nguyên không dấu: docs.oracle.com/javase/8/docs/api/java/lang/Integer.html
Jakub Kotowski

4
Cảm ơn, @jkbkot, thật tốt khi biết điều đó. Mặc dù có vẻ như đại diện vẫn được ký, nhưng một số hoạt động chưa được ký được thực hiện như một chức năng. Thật khó để thêm hai dấu không dấu int...
gaborsch

5
@GaborSch Trong Java, int foo = Integer.MAX_VALUE + 1; System.out.println(Integer.toUnsignedLong(foo));bản in 2147483648char là loại không dấu
howlger

2
@howlger Integer.MAX_VALUE + 10x80000000trong hex, vì sự tràn (và tương đương với Integer.MIN_VALUE). Nếu bạn chuyển đổi nó thành không dấu (dài), bit dấu sẽ được coi như bit giá trị, vì vậy nó sẽ như vậy 2147483648. Cảm ơn bạn đã charlưu ý. charkhông được ký, bạn đúng, nhưng char không thực sự được sử dụng để tính toán, đó là lý do tại sao tôi rời khỏi danh sách.
gaborsch

72

Trong C, số nguyên (đối với máy 32 bit) là 32 bit và nó nằm trong khoảng từ -32768 đến +32767.

Sai lầm. Số nguyên có chữ ký 32 bit trong biểu diễn bổ sung của 2 có phạm vi -2 31 đến 2 31 -1 tương đương với -2,147,483,648 đến 2,147,483,647.


3
Tôi đã sửa lỗi lũy thừa của bạn, **thậm chí không phải là C và theo tôi thì không rõ lắm. :)
thư giãn

2
Có vẻ tốt hơn bây giờ, cảm ơn! Quá nhiều Python, tôi cho rằng. Tôi tránh ^vì nó thườngxor
Kos

5
Tôi nghĩ rằng quan điểm của tôi là vì C không có toán tử lũy thừa, tôi không nghĩ rằng phần cụ thể đó nên được định dạng dưới dạng mã. :)
thư giãn

19

Một số nguyên 32 bit nằm trong khoảng từ -2,147,483,648 đến 2,147,483,647. Tuy nhiên, thực tế là bạn đang Csử dụng máy 32 bit không có nghĩa là trình biên dịch của bạn sử dụng số nguyên 32 bit.


1
Ít nhất là bản sao của tôi về ông Kernighan và ông Ritchies "Ngôn ngữ lập trình C" nói trong A4.2 intlà "chiều rộng tự nhiên của máy" mà tôi hiểu là 32 bit khi biên dịch cho máy 32 bit.
sáu

7
Điều này phụ thuộc vào trình biên dịch, không phải máy tôi tin. Tôi đã có một trình biên dịch 16 bit được cài đặt trên máy 64 bit của tôi chẳng hạn.
Ivaylo Strandjev

Tất nhiên trình biên dịch 16 bit của bạn cho mã x86 16 bit chỉ sử dụng 16 bit. Nhưng đó không phải là quan điểm của tôi. Ngay cả bộ xử lý 32 bit x86 chạy ở chế độ 16 bit chỉ có dung lượng riêng chỉ là 16 bit. Quan điểm của tôi là nền tảng đích mà trình biên dịch có vấn đề. Ví dụ: nếu bạn có trình biên dịch cho 80286, bạn vẫn sẽ tạo mã 16 bit và do đó có số nguyên 16 bit.
sáu

2
@junix Tôi tin rằng đó chính xác là những gì tôi chỉ ra trong câu trả lời của mình. Đây không phải là HĐH chỉ định số nguyên của bạn có bao nhiêu bit. Nền tảng đích là một thuộc tính của trình biên dịch, không phải của hệ điều hành mà nó đang làm việc hoặc bộ xử lý mà bạn có.
Ivaylo Strandjev

Như tôi đã viết trong bình luận đầu tiên của tôi. "Đó là 32 bit khi biên dịch cho máy 32 bit". OP viết trong bài đăng "số nguyên (cho máy 32 bit)" Vì vậy, từ những gì tôi hiểu, anh ấy không đề cập đến hệ điều hành của mình, hoặc máy của anh ấy, anh ấy đang đề cập đến nền tảng mục tiêu của mình
Junix 21/213

15

Định nghĩa ngôn ngữ C chỉ định phạm vi tối thiểu cho các loại dữ liệu khác nhau. Đối với int, phạm vi tối thiểu này là -32767 đến 32767, nghĩa là intphải rộng tối thiểu 16 bit. Việc triển khai là miễn phí để cung cấp một intloại rộng hơn với phạm vi rộng hơn tương ứng. Ví dụ: trên máy chủ phát triển SLES 10 tôi làm việc, phạm vi là -2147483647 đến 2137483647.

Vẫn còn một số hệ thống sử dụng loại 16 bit int(All The World Is Not A VAX x86), nhưng có rất nhiều hệ thống sử dụng loại 32 bit intvà có thể một số sử dụng loại 64 bit.

Ngôn ngữ C được thiết kế để chạy trên các kiến ​​trúc khác nhau. Java được thiết kế để chạy trong một máy ảo che giấu những khác biệt về kiến ​​trúc.


Đối với int 16 bit, nó là -3276 8 đến 32767. Đối với int 32 bit, nó là -214748364 8 đến 2147483647. Phạm vi được chỉ định từ -2 ^ (n bit-1) đến + 2 ^ (n bit-1 ) - 1.
thần thoại

3
@Maven: 5.2.4.2.1 - INT_MINđược chỉ định là -32767. Đừng giả sử bổ sung của hai.
John Bode

8

Tương đương nghiêm ngặt của java intlong inttrong C.

Chỉnh sửa: Nếu int32_tđược xác định, thì nó là tương đương về độ chính xác. long intđảm bảo độ chính xác của java int, bởi vì nó được đảm bảo có kích thước tối thiểu 32 bit.


bạn đúng, tương đương là int32_tnếu nó được xác định bởi trình biên dịch của bạn
UmNyobe

7

Đó là bởi vì trong C - số nguyên trên máy 32 bit không có nghĩa là 32 bit được sử dụng để lưu trữ, nó cũng có thể là 16 bit. Nó phụ thuộc vào máy (phụ thuộc vào việc thực hiện).


1
Chà, đáng chú ý là hành vi triển khai điển hình đang sử dụng "chiều rộng máy" cho int. Nhưng limits.hgiúp tìm ra đâu là sự thật chính xác
Junix 21/2/13

3
Nhưng trong thực tế, tôi không nghĩ rằng trình biên dịch C cho 32 đã được tạo mà không có int là 32 bit. Tiêu chuẩn có thể cho phép trình biên dịch thực hiện int có bản chất biến thái, nhưng vì một số lý do, không ai muốn tạo trình biên dịch C biến thái. Xu hướng là làm cho trình biên dịch C hữu ích.
Lundin


4

Trên thực tế kích thước theo bit của int, short, long phụ thuộc vào việc thực hiện biên dịch.

Ví dụ trên Ubuntu của tôi 64 cắn tôi có shorttrong 32bit, khi vào một phiên bản một 32bit Ubuntu nó là 16bit.


2

Nó thực sự rất đơn giản để hiểu, bạn thậm chí có thể tính toán nó với máy tính google: bạn có 32 bit cho một int và máy tính là nhị phân, do đó bạn có thể có 2 giá trị mỗi bit (tại chỗ). nếu bạn tính 2 ^ 32, bạn sẽ nhận được 4.294.967.296. vì vậy nếu bạn chia số này cho 2, (vì một nửa trong số chúng là số nguyên âm và nửa còn lại là số dương), thì bạn nhận được 2.147.483.648. và con số này là số nguyên lớn nhất có thể được biểu thị bằng 32 bit, mặc dù nếu bạn chú ý, bạn sẽ nhận thấy rằng 2.147.483.648 lớn hơn 2.147.483.647 bởi 1, điều này là do một trong những số đại diện cho 0 nằm ngay giữa không may 2 ^ 32 không phải là một số lẻ, do đó bạn không chỉ có một số ở giữa, vì vậy các số nguyên sở hữu có một mật mã ít hơn trong khi các số âm có được một nửa hoàn chỉnh 2.147.483.648.

Và đó là nó. Nó phụ thuộc vào máy không phụ thuộc vào ngôn ngữ.


2
Đây không phải là những gì anh ấy yêu cầu ... câu hỏi là "tại sao C int khác với Java int?"
ElectronWill

Và trong Java, kích thước của int không phụ thuộc vào máy. int== Đã ký 32 bit, hai phần bù được xác định bởi đặc tả ngôn ngữ Java và được khắc trên các trang của unobtainium anodized . (OK, có thể không phải là bit cuối cùng.)
Stephen C

1

Trong phạm vi C cho __int32 là mật2147483648 đến 2147483647. Xem tại đây để biết phạm vi đầy đủ.

unsigned short 0 to 65535
signed short 32768 to 32767
unsigned long 0 to 4294967295
signed long 2147483648 to 2147483647

Không có gì đảm bảo rằng một 'int' sẽ là 32 bit, nếu bạn muốn sử dụng các biến có kích thước cụ thể, đặc biệt khi viết mã liên quan đến thao tác bit, bạn nên sử dụng 'Loại số nguyên tiêu chuẩn'.

Trong Java

Kiểu dữ liệu int là số nguyên bổ sung có hai chữ ký 32 bit. Nó có giá trị tối thiểu là -2,147,483,648 và giá trị tối đa là 2,147,483,647 (đã bao gồm).


2
Các giá trị bạn trích dẫn cho C chỉ là phạm vi tối thiểu.
Oliver Charlesworth

@OliCharlesworth Phạm vi nếu từ tối thiểu đến tối đa.
Achintya Jha

6
Ý tôi là, phạm vi cho mỗi loại được phép lớn hơn những gì bạn đã trích dẫn ở trên.
Oliver Charlesworth

3
Không có gì trong C được gọi là __int32. Microsoft không có trình biên dịch C tuân thủ nghiêm ngặt, vậy ai quan tâm đến cách trình biên dịch không C của họ hoạt động? Nguồn duy nhất có liên quan là ISO9899, ​​5.2.4.2.1 "Kích thước của các loại số nguyên" hoặc 7.20.2.1 "Giới hạn của các loại số nguyên có chiều rộng chính xác". Không ai trong số đó tương thích với Microsoft goo.
Lundin

2
C99 không thêm int32_t, int16_t, v.v. vào tiêu chuẩn. Không tương thích 100% với các bổ sung của Microsoft, nhưng chúng hoạt động theo những cách tương tự.
Hỏi về Monica

-1

trong tiêu chuẩn C, bạn có thể sử dụng INT_MAX làm giá trị 'int' tối đa, hằng số này phải được xác định trong "giới hạn.h". Các hằng số tương tự được định nghĩa cho các loại khác ( http://www.acm.uiuc.edu/webmonkeys/book/c_guide/2.5.html ), như đã nêu, các hằng số này phụ thuộc vào việc triển khai nhưng có giá trị tối thiểu theo các bit tối thiểu cho từng loại, như quy định trong tiêu chuẩn.


5
Điều này không thực sự có được xung quanh để giải quyết câu hỏi của OP. Ngoài ra, các phần cốt lõi của một câu trả lời thực sự không nên được chôn trên một trang web khác.
Brad Koch
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.