2009-11-30 22 views

Trả lời

95

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

  • short intint: -32.767 tới 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 rằng không có, long intkhông thể được dựa vào để lưu trữ bất kỳ số 10 chữ số. Tuy nhiên, một loại lớn hơn long long int đã được giới thiệu với C trong C99 và C++ trong C++ 11 (loại này cũng thường được hỗ trợ như một phần mở rộng của trình biên dịch được xây dựng cho các tiêu chuẩn cũ hơn không bao gồm nó). Phạm vi tối thiểu đối với 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).


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

+0

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

+0

lý do tại sao phạm vi tích cực dài dài == dải tiêu cực –

+0

@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 bổ sung hoặc biểu diễn độ lớn của người đó. – caf

-1

Bạn nên xem các chuyên môn của mẫu số_limits <> mẫu cho một loại nhất định. Của nó trong tiêu đề.

29

Kích thước của các loại 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 để nói những gì kích thước họ đang ở trên nền tảng của bạn là sử dụng numeric limits

Ví dụ, giá trị tối đa cho một int có thể được tìm thấy bằng cách:

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

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

0100 1000 

Quyền hầu hết các bit (số) khi thiết lập để 1 đại diện cho 2 , các bit tiếp theo 2 , sau đó 2 và vân vân cho đến khi chúng tôi nhận được nhiều nhất từ ​​bên trái, nếu số không được ký hiệu đại diện cho 2 .

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

Nếu chúng ta đặt tất cả các giá trị đến 1:

11111111 

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

Trên máy tính của tôi và int và dài đều giống nhau, mỗi thể giữ khoảng -2 -2 - 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.

+0

Kích thước tối thiểu cho loại số nguyên được bắt buộc bởi các tiêu chuẩn có liên quan (mặc dù kích thước chính xác là không). – caf

0

Có thể không dấu dài giữ số mười chữ số (1.000.000.000 - 9.999.999.999) trên máy tính 32 bit.

Không

7

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

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

này sẽ (tùy thuộc vào trình biên dịch và archicture) in 2, 4 hoặc 8, nói dài 2 byte, dài 4 byte, vv

Cho phép giả định đó 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à (trong 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 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; 

Thats giá trị lớn nhất mà một unsigned int có thể giữ, được hiển thị trong biểu diễn cơ sở 10.

Bây giờ, hãy thực hiện điều đó cho thời gian dài, quần short 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 các số dấu phẩy động (tức là gấp đôi hoặc nổi).

Hope this helps

+1

Nếu bạn thử điều này với ints đã ký, bạn sẽ nhận được số âm. Đọc trên "hai lời khen" (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 quá. http://en.wikipedia.org/wiki/Twos_Compliment –

2

Đối unsigned kiểu dữ liệu không có chút dấu hiệu và tất cả các bit là 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ành cho dữ liệu.

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

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

Bước: 2 -> Áp dụng các tính toán 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 unsigned int size = 4 byte (32 bit) -> Phạm vi [0, (2^(32)) - 1]

Đối với ký int size = 4 byte (32 bit) -> Phạm vi [- (2^(32-1)), (2^(32-1)) - 1]

5

Để tìm hiểu 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 long long chỉ hợp pháp trong C99 và trong C++ 11.

3

Trong C++, hiện tại, dữ liệu int và dữ liệu khác được lưu trữ bằng phương pháp khen của 2. Điều đó có nghĩa phạm vi là:

-2147483648 to 2147483647 

hoặc -2^31 để 2^31-1

1 chút được dành riêng cho 0 giá trị rất tích cực là một trong ít hơn 2^(31)

Các vấn đề liên quan