2010-04-03 30 views
5

Tôi có đoạn code:Tại sao chuyển đổi từ một size_t thành int không dấu cho tôi một cảnh báo?

unsigned int length = strlen(somestring); 

Tôi đang biên soạn với mức độ cảnh báo vào ngày 4, và nó nói với tôi rằng "chuyển đổi từ size_t để unsigned int, có thể mất dữ liệu" khi một size_t là một typedef cho một unsigned int.

Tại sao !?

Chỉnh sửa:

Tôi vừa giải quyết vấn đề của riêng mình. Tôi là người dùng XP và trình biên dịch của tôi đang kiểm tra khả năng tương thích 64 bit. Vì size_t là nền tảng phụ thuộc, cho 64 bit, nó sẽ là một unsigned long long, trong đó không giống như một unsigned int.

+1

Tất cả các kích thước đều phụ thuộc. 'size_t' không phải bằng bất kỳ kiểu nào khác, tất cả chúng có thể khác nhau. Bảo đảm duy nhất bạn có là 'sizeof (char) == 1', và số bit trong' char' (cũng phụ thuộc!) Được định nghĩa trong macro 'CHAR_BIT' trong tiêu đề' ', và 'sizeof (ngắn)> = sizeof (char)', 'sizeof (int)> = sizeof (dài)', và 'sizeof (long long)> = sizeof (long)'. – GManNickG

+0

@GMan: Thực ra tôi tin 'sizeof (long)> = sizeof (int)' :) +1 mặc dù –

+0

@Billy: Oh dangit. Bây giờ đã quá muộn để sửa. -_- Ôi chà. : 3 – GManNickG

Trả lời

8

unsigned int là loại hẹp hơn trên máy của bạn hơn size_t. Nhiều khả năng size_t có chiều rộng 64 bit, trong khi unsigned int rộng 32 bit.

EDIT: size_t không phải là typedef cho int không dấu.

+0

Vâng, 'size_t' _is_ một typedef cho' unsigned' trên một số hệ thống. Nó sẽ không được trên hệ thống LP64 và LLP64 mặc dù. :-) –

+0

@ James McNellis: Có thể, nhưng tiêu chuẩn không định nghĩa nó theo cách đó :) –

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