unsigned la gi

1. Unsigned integers (Số nguyên vẹn ko dấu)

Trong bài học kinh nghiệm trước (Số nguyên vẹn với ký hiệu(có dấu) hoặc hay còn gọi là số nguyên), tất cả chúng ta vẫn nhắc đến những số nguyên vẹn với ký hiệu, là 1 tụ hợp những loại tài liệu hoàn toàn có thể chứa chấp những số nguyên vẹn dương và âm, bao hàm 0.

C ++ cũng tương hỗ những số nguyên vẹn ko vệt. Số nguyên vẹn ko vệt là số nguyên vẹn chỉ hoàn toàn có thể chứa chấp những số nguyên vẹn ko âm.

Bạn đang xem: unsigned la gi

2. Định nghĩa số nguyên vẹn ko dấu

Để nghĩa một số trong những nguyên vẹn ko vệt, tất cả chúng ta dùng kể từ khóa unsigned. Theo quy ước, điều này được đặt điều trước loại dữ liệu:

unsigned short us;
unsigned int ui;
unsigned long ul;
unsigned long long ull;

3. Phạm vi của số nguyên vẹn ko dấu

Số nguyên vẹn ko vệt 1 byte với phạm vi kể từ 0 cho tới 255. So sánh độ quý hiếm này với phạm vi số nguyên vẹn với ký hiệu thì 1 byte kể từ -128 cho tới 127. Cả nhị hoàn toàn có thể tàng trữ 256 độ quý hiếm không giống nhau, tuy nhiên số nguyên vẹn với ký hiệu tiếp tục dùng 1/2 phạm vi của bọn chúng cho những số âm, trong những khi số nguyên vẹn ko vệt hoàn toàn có thể tàng trữ số dương rộng lớn gấp hai.

Ở phía trên, một bảng hiển thị phạm vi cho những số nguyên vẹn ko dấu:

Size/TypeRange
1 byte unsigned0 vĩ đại 255
2 byte unsigned0 vĩ đại 65,535
4 byte unsigned0 vĩ đại 4,294,967,295
8 byte unsigned0 vĩ đại 18,446,744,073,709,551,615

Một phát triển thành ko vệt n-bit với phạm vi kể từ 0 cho tới (2n) -1.

Khi ko đòi hỏi số âm, số nguyên vẹn ko vệt đặc biệt tương thích mang đến mạng và khối hệ thống với không nhiều bộ lưu trữ, chính vì số nguyên vẹn ko vệt hoàn toàn có thể tàng trữ số dương nhiều hơn thế nhưng mà ko rung rinh thêm thắt bộ lưu trữ.

4. Các vấn đề cần ghi ghi nhớ của số nguyên vẹn với và không tồn tại dấu

Lập trình viên mới nhất nhiều khi lộn lạo thân thuộc số nguyên vẹn với và không tồn tại vệt. Sau đó là một cơ hội đơn giản và giản dị nhằm ghi ghi nhớ sự không giống biệt: nhằm phân biệt số âm với số dương, tất cả chúng ta dùng vệt âm. Nếu một số trong những nhưng mà không tồn tại ký hiệu âm or dương(+, -) thì tất cả chúng ta fake sử cơ một số trong những là dương. Do cơ, một số trong những nguyên vẹn với vệt (số nguyên vẹn với ký hiệu) hoàn toàn có thể có mức giá trị là dương và âm. Một số nguyên vẹn không tồn tại vệt (số nguyên vẹn ko dấu) thì những độ quý hiếm đều là dương.

5. Tràn số nguyên vẹn ko dấu

Câu căn vặn mẹo: Điều gì xẩy ra nếu như tất cả chúng ta cố tàng trữ số 280 (yêu cầu 9 bit nhằm biểu diễn) nhập một số trong những nguyên vẹn ko vệt 1 byte? quý khách hoàn toàn có thể cho là câu vấn đáp là tràn ngập! Nhưng, nó ko tràn.

Theo khái niệm, số nguyên vẹn ko vệt ko thể tràn.

Chúng tớ hãy đánh giá điều này bằng phương pháp dùng những số nguyên vẹn 2 byte:

#include <iostream>
 
int main()
{
    unsigned short x{ 65535 }; // largest 16-bit unsigned value possible
    std::cout << "x was: " << x << '\n';
 
    x = 65536; // 65536 is out of our range, sánh we get wrap-around
    std::cout << "x is now: " << x << '\n';
 
    x = 65537; // 65537 is out of our range, sánh we get wrap-around
    std::cout << "x is now: " << x << '\n';
 
    return 0;
}

Bạn suy nghĩ sản phẩm của công tác này được xem là gì?

x was: 65535
x is now: 0
x is now: 1
#include <iostream>
 
int main()
{
    unsigned short x{ 0 }; // smallest 2-byte unsigned value possible
    std::cout << "x was: " << x << '\n';
 
    x = -1; // -1 is out of our range, sánh we get wrap-around
    std::cout << "x is now: " << x << '\n';
 
    x = -2; // -2 is out of our range, sánh we get wrap-around
    std::cout << "x is now: " << x << '\n';
 
    return 0;
}
x was: 0
x is now: 65535
x is now: 65534

6. Cuộc giành cãi về số nguyên vẹn ko dấu

Nhiều developer(và một số trong những developer rộng lớn, như Google) tin yêu rằng những developer thông thường nên tách những số nguyên vẹn ko vệt.

Điều này phần rộng lớn là vì nhị hành động tại đây hoàn toàn có thể phát sinh yếu tố.

Đầu tiên, hãy đánh giá quy tắc trừ của nhị số ko vệt, ví dụ như 3 và 5. 3 trừ 5 là -2, tuy nhiên -2 hoàn toàn có thể được trình diễn bên dưới dạng một số trong những ko vệt như sau.

Xem thêm: Bảng Xếp Hạng Bóng Đá Ý Serie A Mùa Giải Mới Nhất Tại XoilacTV

#include <iostream>
 
int main()
{
	unsigned int x{ 3 };
	unsigned int y{ 5 };
 
	std::cout << x - hắn << '\n';
	return 0;
}

Chương trình đưa đến sản phẩm như sau:

4294967294

Thứ nhị, hành động ko ước muốn hoàn toàn có thể kéo theo khi chúng ta trộn những số nguyên vẹn với vệt và ko vệt. Trong ví dụ bên trên, trong cả Lúc một trong số toán hạng (x hoặc y) với vệt, toán hạng không giống (không dấu) tiếp tục thực hiện mang đến toán tử với vệt được gửi trở thành thành một số trong những nguyên vẹn ko vệt, và hành động này tiếp tục kéo theo sản phẩm ko mong ngóng.

Hãy đánh giá đoạn trích sau:

void doSomething(unsigned int x)
{
    // Run some code x times
}
 
int main()
{
    doSomething(-1);
 
    return 0;
}

Tác fake của doSomething() vẫn mong ngóng ai cơ gọi hàm này chỉ thông qua số dương. Nhưng người gọi đang được chuyển sang -1. Điều gì xẩy ra nhập tình huống này?

Đối số với vệt của -1 được quy đổi trọn vẹn trở thành thông số ko vệt. -1 ko ở trong phạm vi của một số trong những ko vệt, nên là nó xung quanh một số trong những rộng lớn (có thể là 4294967295). Sau cơ, công tác của các bạn sẽ tạo ra kq sai. Tồi tệ rộng lớn, không tồn tại cơ hội này đảm bảo chất lượng nhằm bảo đảm an toàn ngăn chặn biểu hiện này xẩy ra. C ++ tiếp tục tự tại quy đổi trong số những số với vệt và ko vệt.

Nếu bạn phải bảo đảm an toàn một hàm ngăn chặn những nguồn vào xấu đi, thay cho nhập cơ hãy dùng một xác nhận hoặc nước ngoài lệ. Cả nhị đều được bảo đảm an toàn điều này.

Một số ngữ điệu thiết kế tân tiến (như Java) và những framework (như .NET) hoặc ko bao hàm những loại ko vệt hoặc số lượng giới hạn việc dùng bọn chúng.

Các thiết kế viên mới nhất hay được dùng những số nguyên vẹn ko vệt nhằm thể hiện tại tài liệu ko âm hoặc nhằm tận dụng tối đa phạm vi bổ sung cập nhật. Bjarne Stroustrup, ngôi nhà kiến thiết của C ++, cho thấy thêm, dùng số nguyên vẹn ko vệt chứ không với vệt để sở hữu thêm 1 bit nhằm trình diễn những số nguyên vẹn dương gần như là ko cần là 1 phát minh hoặc.

Lưu ý: Tránh dùng số ko vệt, trừ tình huống rõ ràng hoặc lúc không thể tách ngoài.

Nếu các bạn dùng số ko vệt, tách trộn lộn những số với vệt và ko vệt nếu như hoàn toàn có thể.

7. Vậy đâu lúc nào là phù hợp nhằm dùng số ko dấu?

Vẫn còn một vài ba tình huống nhập C ++ dùng những số ko vệt (hoặc cần thiết thiết).

Xem thêm: vợ à địa ngục chờ em

Đầu tiên, những số ko vệt được ưa quí Lúc xử lý thao tác bit.

Thứ nhị, việc dùng những số ko vệt vẫn ko thể tách ngoài nhập một số trong những tình huống, đa số là những việc cần thực hiện với lập index mang đến mảng. Chúng tớ tiếp tục thưa nhiều hơn thế về điều này trong số bài học kinh nghiệm về mảng và lập index mang đến mảng.

Cũng Note rằng nếu khách hàng đang được cách tân và phát triển cho 1 khối hệ thống nhúng (ví dụ: Arduino) hoặc một số trong những toàn cảnh số lượng giới hạn Chip xử lý / bộ lưu trữ không giống, việc dùng những số ko vệt là phổ cập rộng lớn và được đồng ý (và nhập một số trong những tình huống, ko thể tách khỏi) vì như thế nguyên do hiệu suất.