Loại số nguyên có thể lưu trữ phạm vi giá trị nào trong C ++


86

Có thể unsigned long intgiữ một số gồm mười chữ số (1.000.000.000 - 9.999.999.999) trên máy tính 32 bit không?

Ngoài ra, dãy là gì unsigned long int, long int, unsigned int, short int, short unsigned int, và int?

Câu trả lời:


139

Các phạm vi tối thiểu bạn có thể dựa vào là:

  • short intint: -32,767 đến 32,767
  • unsigned short intunsigned int: 0 đến 65,535
  • long int: -2,147,483,647 đến 2,147,483,647
  • unsigned long int: 0 đến 4,294,967,295

Điều này có nghĩa là không, long int không thể dựa vào đó để lưu trữ bất kỳ số 10 chữ số nào. Tuy nhiên, một kiểu lớn hơn long long intđã được đưa vào C trong C99 và C ++ trong C ++ 11 (kiểu này cũng thường được hỗ trợ như một phần mở rộng bởi các trình biên dịch được xây dựng cho các tiêu chuẩn cũ không bao gồm nó). Phạm vi tối thiểu cho loại này, nếu trình biên dịch của bạn hỗ trợ nó, là:

  • long long int: -9,223,372,036,854,775,807 đến 9,223,372,036,854,775,807
  • unsigned long long int: 0 đến 18.446.744.073.709.551.615

Vì vậy, loại đó sẽ đủ lớn (một lần nữa, nếu bạn có sẵn).


Một lưu ý cho những người tin rằng tôi đã mắc sai lầm với những giới hạn thấp hơn này - tôi chưa từng. Yêu cầu C đối với các phạm vi được viết để cho phép các biểu diễn số nguyên có độ lớn dấu hiệu hoặc phần bù của chúng, trong đó giá trị có thể biểu diễn thấp nhất và giá trị có thể biểu diễn cao nhất chỉ khác nhau về dấu hiệu. Nó cũng được phép có biểu diễn bổ sung của hai trong đó giá trị có bit dấu 1 và tất cả các bit giá trị 0 là biểu diễn bẫy chứ không phải là giá trị pháp lý. Nói cách khác, intkhông cần thiết để có thể đại diện cho giá trị -32,768.


Tiêu đề ban đầu cũng nói "C / C ++".
caf,

tại sao lâu dài int tích cực phạm vi == phạm vi tiêu cực
mohamed Abdallah

1
@mohamedabdallah: Xem đoạn cuối cùng của câu trả lời: phạm vi tiêu chuẩn C là cách đó để cho phép các đại diện bổ sung hoặc cường độ dấu hiệu của chúng.
caf

Aha.. Tôi nhận ra điều đó intcó nghĩa là long int.
mê cung

32

Kích thước của các kiểu số không được xác định trong tiêu chuẩn C ++, mặc dù kích thước tối thiểu là. Cách để biết kích thước của chúng trên nền tảng của bạn là sử dụng giới hạn số

Ví dụ: giá trị lớn nhất cho một int có thể được tìm thấy bằng:

std::numeric_limits<int>::max();

Máy tính không hoạt động trong cơ số 10, có nghĩa là giá trị lớn nhất sẽ ở dạng 2 n -1 do cách các số biểu diễn trong bộ nhớ. Lấy ví dụ tám bit (1 byte)

  0100 1000

Bit ngoài cùng bên phải (số) khi được đặt thành 1 đại diện cho 2 0 , bit tiếp theo 2 1 , sau đó 2 2 và cứ tiếp tục như vậy cho đến khi chúng ta về phía bên trái nhất bit mà nếu số không có dấu sẽ biểu thị 2 7 .

Vì vậy, số đại diện cho 2 6 + 2 3 = 64 + 8 = 72, bởi vì bit thứ 4 từ bên phải và bit thứ 7 bên phải bên trái được đặt.

Nếu chúng tôi đặt tất cả các giá trị thành 1:

11111111

Con số bây giờ là (giả sử không có dấu )
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
Và như chúng ta có thể thấy, đó là giá trị lớn nhất có thể được biểu diễn bằng 8 bit.

Trên máy của tôi và int và long đều giống nhau, mỗi cái có thể giữ từ -2 31 đến 2 31 - 1. Theo kinh nghiệm của tôi, kích thước phổ biến nhất trên máy tính để bàn 32 bit hiện đại.


Kích thước tối thiểu cho kiểu số nguyên được yêu cầu bởi các tiêu chuẩn liên quan (mặc dù kích thước chính xác thì không).
caf,

13

Để tìm ra các giới hạn trên hệ thống của bạn :

#include <iostream>
#include <limits>
int main(int, char **) {
  std::cout
    << static_cast< int >(std::numeric_limits< char >::max()) << "\n"
    << static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
    << std::numeric_limits< short >::max() << "\n"
    << std::numeric_limits< unsigned short >::max() << "\n"
    << std::numeric_limits< int >::max() << "\n"
    << std::numeric_limits< unsigned int >::max() << "\n"
    << std::numeric_limits< long >::max() << "\n"
    << std::numeric_limits< unsigned long >::max() << "\n"
    << std::numeric_limits< long long >::max() << "\n"
    << std::numeric_limits< unsigned long long >::max() << "\n";
}

Lưu ý rằng điều đó long longchỉ hợp pháp trong C99 và C ++ 11.


9

Những người khác ở đây sẽ đăng liên kết đến kích thước dữ liệu và sự lựa chọn, v.v.
Tôi sẽ cho bạn biết cách tự mình tìm ra.
Viết một ứng dụng nhỏ sẽ thực hiện những việc sau.

unsigned int ui;
std::cout <<  sizeof(ui));

điều này sẽ (tùy thuộc vào trình biên dịch và bản lưu trữ) in 2, 4 hoặc 8, tức là dài 2 byte, dài 4 byte, v.v.

Giả sử đó là 4.

Bây giờ bạn muốn giá trị tối đa 4 byte có thể lưu trữ, giá trị tối đa cho một byte là (tính bằng hex) 0xFF. Giá trị tối đa của bốn byte là 0x theo sau là 8 f (một cặp f cho mỗi byte, 0x cho trình biên dịch biết rằng chuỗi sau là một số hex). Bây giờ hãy thay đổi chương trình của bạn để gán giá trị đó và in kết quả

unsigned int ui = 0xFFFFFFFF;
std::cout <<  ui;

Đó là giá trị tối đa mà một int không dấu có thể giữ, được hiển thị trong biểu diễn cơ số 10.

Bây giờ hãy làm điều đó cho áo dài, quần đùi và bất kỳ giá trị INTEGER nào khác mà bạn tò mò.

NB: Cách tiếp cận này sẽ không hoạt động đối với số dấu phẩy động (tức là kép hoặc float).

Hi vọng điêu nay co ich


1
Nếu bạn thử điều này với các int có dấu, bạn sẽ nhận được số âm. Đọc "lời khen của hai người" (liên kết được cung cấp), thật dễ dàng để có được đầy đủ (tích cực và tiêu cực) cho những điều này. vi.wikipedia.org/wiki/Twos_Compliment
Binary Worrier vào

8

Trong C ++, dữ liệu int và các dữ liệu khác được lưu trữ bằng phương thức 2's. Điều đó có nghĩa là phạm vi là:

-2147483648 to 2147483647

hoặc -2 ^ 31 đến 2 ^ 31-1

1 bit được dành riêng cho 0 nên giá trị dương nhỏ hơn 2 ^ (31)


4

Bạn có thể sử dụng các hàm numeric_limits<data_type>::min()numeric_limits<data_type>::max()có trong limitstệp tiêu đề và tìm giới hạn của từng loại dữ liệu.

#include <iostream>
#include <limits>
using namespace std;
int main()
{
    cout<<"Limits of Data types:\n";    
    cout<<"char\t\t\t: "<<static_cast<int>(numeric_limits<char>::min())<<" to "<<static_cast<int>(numeric_limits<char>::max())<<endl;
    cout<<"unsigned char\t\t: "<<static_cast<int>(numeric_limits<unsigned char>::min())<<" to "<<static_cast<int>(numeric_limits<unsigned char>::max())<<endl;
    cout<<"short\t\t\t: "<<numeric_limits<short>::min()<<" to "<<numeric_limits<short>::max()<<endl;
    cout<<"unsigned short\t\t: "<<numeric_limits<unsigned short>::min()<<" to "<<numeric_limits<unsigned short>::max()<<endl;
    cout<<"int\t\t\t: "<<numeric_limits<int>::min()<<" to "<<numeric_limits<int>::max()<<endl;
    cout<<"unsigned int\t\t: "<<numeric_limits<unsigned int>::min()<<" to "<<numeric_limits<unsigned int>::max()<<endl;
    cout<<"long\t\t\t: "<<numeric_limits<long>::min()<<" to "<<numeric_limits<long>::max()<<endl;
    cout<<"unsigned long\t\t: "<<numeric_limits<unsigned long>::min()<<" to "<<numeric_limits<unsigned long>::max()<<endl;
    cout<<"long long\t\t: "<<numeric_limits<long long>::min()<<" to "<<numeric_limits<long long>::max()<<endl;
    cout<<"unsiged long long\t: "<<numeric_limits<unsigned long long>::min()<<" to "<<numeric_limits<unsigned long long>::max()<<endl;
    cout<<"float\t\t\t: "<<numeric_limits<float>::min()<<" to "<<numeric_limits<float>::max()<<endl;
    cout<<"double\t\t\t: "<<numeric_limits<double>::min()<<" to "<<numeric_limits<double>::max()<<endl;
    cout<<"long double\t\t: "<<numeric_limits<long double>::min()<<" to "<<numeric_limits<long double>::max()<<endl;
}

Kết quả đầu ra sẽ là: Giới hạn của kiểu dữ liệu:

  • ký tự: -128 đến 127
  • ký tự không dấu: 0 đến 255
  • ngắn: -32768 đến 32767
  • không dấu ngắn: 0 đến 65535
  • int: -2147483648 đến 2147483647
  • int unsigned: 0 đến 4294967295
  • dài: -2147483648 đến 2147483647
  • chưa ký dài: 0 đến 4294967295
  • dài dài: -9223372036854775808 đến 9223372036854775807
  • dài dài không dấu: 0 đến 18446744073709551615
  • float: 1.17549e-038 đến 3.40282e + 038
  • gấp đôi: 2.22507e-308 thành 1.79769e + 308
  • dài đôi: 3,3621e-4932 đến 1,18973e + 4932

2

Đối với kiểu dữ liệu không dấu không có bit dấu và tất cả các bit đều dành cho dữ liệu; trong khi đối với kiểu dữ liệu đã ký, MSB được chỉ ra bit dấu và các bit còn lại là dữ liệu.

Để tìm phạm vi, hãy làm những việc sau:

Bước: 1 -> Tìm ra không có byte nào cho kiểu dữ liệu cho.

Bước: 2 -> Áp dụng các phép tính sau.

      Let n = no of bits in data type  

      For signed data type ::
            Lower Range = -(2^(n-1)) 
            Upper Range = (2^(n-1)) - 1)  

      For unsigned data type ::
            Lower Range = 0 
            Upper Range = (2^(n)) - 1 

Ví dụ

Đối với kích thước int không dấu = 4 byte (32 bit) -> Phạm vi [0, (2 ^ (32)) - 1]

Đối với kích thước int có dấu = 4 byte (32 bit) -> Phạm vi [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]


1

Int dài không dấu có thể chứa một số gồm mười chữ số (1.000.000.000 - 9.999.999.999) trên máy tính 32 bit.

Không



0

Bạn nên xem các đặc điểm của mẫu <> numeric_limits cho một loại nhất định. Của nó trong tiêu đề.

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.