2013-04-18 30 views
7

Trong file nguồn mà tôi đang sử dụng trong dự án của tôi, có một so sánh giữa ssize_tsize_t biến:Cast ssize_t hoặc size_t

ssize_t sst; 
size_t st; 

if(sst == st){...} 

Tôi muốn thoát khỏi cảnh báo:

warning: comparison between signed and unsigned integer expressions 

Nhưng tôi không chắc chắn, tôi nên truyền biến nào khác?

if((size_t)sst == st){...} 

hoặc

if(sst == (ssize_t)st){...} 

là gì an toàn hơn, tốt hơn, sạch hơn? Cảm ơn

+0

Bạn đang sử dụng ngôn ngữ nào? –

+0

Thẻ đã thêm, C++. – rluks

+0

Cố gắng thêm trước '(ký tên int)' trước số nguyên chưa dấu. Bây giờ nó sẽ là một số nguyên đã ký và sẽ không ném lỗi nữa. –

Trả lời

16

Không có câu trả lời đúng cho câu hỏi này. Có một số câu trả lời có thể, tùy thuộc vào những gì bạn biết một ưu tiên về các giá trị mà các biến đó có thể tiếp tục.

  • Nếu bạn biết rằng sst là không âm, sau đó bạn có thể an toàn đúc sst để size_t, vì điều này sẽ không thay đổi giá trị (bất ngờ, đây là những gì sẽ xảy ra nếu bạn không có diễn viên nào cả).

  • Nếu sst có thể là tiêu cực nhưng bạn biết rằng st sẽ không bao giờ lớn hơn SSIZE_MAX, sau đó bạn có thể yên tâm đúc st-ssize_t, vì điều này sẽ không thay đổi giá trị.

  • Nếu sst có thể âm, và st có thể lớn hơn SSIZE_MAX, thì không được truyền chính xác; hoặc là có thể thay đổi giá trị, dẫn đến so sánh không chính xác. Thay vào đó, bạn sẽ làm như sau if (sst >= 0 && (size_t)sst == st).

Nếu bạn không hoàn toàn chắc chắn rằng một trong hai tình huống đầu tiên áp dụng, chọn tùy chọn thứ ba vì nó là đúng trong mọi trường hợp.

+1

+1 cho biểu thức đơn giản hơn - không có lý do để có '(st <= SSIZE_MAX)' tôi đưa vào câu trả lời của mình. –

3

Hoặc sẽ hoạt động tốt miễn là cả hai giá trị đều phù hợp với phạm vi thể hiện tích cực là ssize_t.

Nếu một trong hai giá trị không, bạn có thể sẽ gặp rắc rối - kiểm tra những trường hợp trước khi thử nghiệm cho sự bình đẳng:

if ((sst >= 0) && (st <= SSIZE_MAX) && (sst == (ssize_t)st)) 
{ 
    ... 
} 

(tôi chắc chắn rằng cáC++ người C sẽ khuyên bạn nên tránh những C- phong cách diễn viên hoàn toàn - Tôi không có nghi ngờ ai đó sẽ bình luận hoặc trả lời và cho bạn biết đúng cách để làm điều đó trong C++.)

+1

Khi bạn loại trừ 'sst <0', bạn chỉ có thể chuyển đổi thành' size_t' và so sánh. –

+0

@StephenCanon, yup. Đã +1 câu trả lời của bạn cho điều đó. –

+1

'static_cast (st)' là một diễn viên C++ an toàn hơn một chút. – Yakk

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