Có thể unsigned long int
giữ 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:
Các phạm vi tối thiểu bạn có thể dựa vào là:
short int
và int
: -32,767 đến 32,767unsigned short int
và unsigned int
: 0 đến 65,535long int
: -2,147,483,647 đến 2,147,483,647unsigned 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,807unsigned long long int
: 0 đến 18.446.744.073.709.551.615Vì 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, int
là không cần thiết để có thể đại diện cho giá trị -32,768.
int
có nghĩa là long int
.
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.
Để 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 long
chỉ hợp pháp trong C99 và C ++ 11.
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
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)
Bạn có thể sử dụng các hàm numeric_limits<data_type>::min()
và numeric_limits<data_type>::max()
có trong limits
tệ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:
Đố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]
Không, chỉ một phần của số mười chữ số có thể được lưu trữ trong một số nguyên dài không dấu có phạm vi hợp lệ từ 0 đến 4,294,967,295. bạn có thể tham khảo cái này: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
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 đề.