2016-11-15 18 views
5

Khi tôi đang làm việc trên string::npos Tôi đã nhận thấy điều gì đó và tôi không thể tìm thấy bất kỳ lời giải thích nào cho nó trên web.Tại sao (18446744073709551615 == -1) đúng?

(string::npos == ULONG_MAX) 

(string::npos == -1) 

là đúng sự thật.

Vì vậy, tôi cố gắng này:

(18446744073709551615 == -1) 

mà cũng đúng.

Làm cách nào để có thể thực hiện được? Có phải vì cuộc trò chuyện nhị phân không?

+3

tràn: p bạn so sánh một unsigned và một giá trị ký – Stargateur

+3

Đây không phải là hành vi undefined . – rubenvb

+1

18446744073709551615 = 2^64 -1 ...sự trùng hợp ma quái? – lelloman

Trả lời

5

string::npos được định nghĩa là constexpr static std::string::size_type string::npos = -1; (hoặc nếu được xác định trong định nghĩa lớp sẽ là constexpr static size_type npos = -1; nhưng điều đó thực sự không liên quan).

Số bao gồm các số âm được chuyển thành loại chưa ký (std::string::size_type về cơ bản là std::size_t, không được ký) hoàn toàn được xác định rõ bởi Chuẩn. -1 kết thúc tốt đẹp với giá trị thể hiện lớn nhất của loại không dấu, trong trường hợp của bạn là 18446744073709551615. Lưu ý rằng giá trị chính xác được xác định bởi vì kích thước của std::size_t được xác định thực hiện (nhưng có khả năng giữ kích thước của mảng lớn nhất có thể trên hệ thống được đề cập).

1

Theo C++ Standard (Số tài liệu: N3337 hoặc Số tài liệu: N4296) std::string::npos được định nghĩa theo cách sau

static const size_type npos = -1; 

nơi std :: string :: size_type là một số kiểu dữ liệu integer unsigned. Vì vậy, không có gì tuyệt vời mà std :: string :: npos bằng -1. Trình khởi tạo được chuyển đổi thành tyhpe của std::string::npos.

Đối với phương trình này

(string::npos == ULONG_MAX) is true, 

sau đó nó có nghĩa là loại std::string::npos đã gõ trong việc thực hiện sử dụng unsigned long. Loại này thường tương ứng với loại size_t.

Trong phương trình này

(18446744073709551615 == -1) 

hiểu theo nghĩa đen bên trái có một số loại không thể thiếu unsigned đó là thích hợp để lưu trữ như một chữ lớn. Do đó toán hạng bên phải cũng được chuyển đổi thành kiểu unsigned này bằng cách đẩy bit dấu. Khi toán hạng bên trái đại diện cho chính nó giá trị tối đa của loại thì chúng bằng nhau.

0

Đây là tất cả về tình trạng tràn có chữ ký và thực tế là số âm được lưu trữ dưới dạng bổ sung 2 giây. Các phương tiện để có được giá trị tuyệt đối của một số âm, bạn đảo ngược tất cả các bit và thêm một số. Có nghĩa là khi thực hiện một 8-bit so sánh 255 và -1 có giá trị nhị phân tương tự 11111111. Điều này cũng áp dụng đối với số nguyên lớn hơn

https://en.m.wikipedia.org/wiki/Two%27s_complement

+0

Số âm không được lưu dưới dạng bổ sung 2 theo định nghĩa/Tiêu chuẩn. Họ chỉ cư xử theo cách đó. – rubenvb

+0

Không có tràn đăng nhập ở đây. –

+0

Đây là kiến ​​trúc CPU phụ thuộc nhưng hầu hết các kiến ​​trúc hiện đại sử dụng 2s bổ sung – doron

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