2012-01-27 33 views

Trả lời

15

Đó là một cách để xác định unsigned hằng số nguyên chữ.

2

nó có nghĩa là "unsigned int", về cơ bản nó hoạt động như một dàn diễn viên để đảm bảo rằng các hằng số được chuyển đổi thành loại thích hợp tại thời gian biên dịch.

+0

Nó không * chuyển đổi *, nó đã thuộc loại 'unsigned int'. –

+1

Có, nhưng * H2CO3 * nói "nó * chức năng * giống như một diễn viên", anh ấy không nói * là * một diễn viên! –

+0

Ý tôi là, không có chữ "u", nó sẽ được ký vì đó là mặc định cho hằng số nguyên. Vì vậy, tge u là một thông báo cho trình biên dịch để mang nó như unsigned. Tôi biết * rằng đó không phải là một diễn viên, nó chỉ là một mẫu để hiểu rõ hơn. –

2

Đó là cách nói cho trình biên dịch biết hằng số 1 có nghĩa là được sử dụng như một số nguyên không dấu. Một số trình biên dịch giả định rằng bất kỳ số nào không có hậu tố như 'u' là kiểu int. Để tránh sự nhầm lẫn này, bạn nên sử dụng hậu tố như 'u' khi sử dụng hằng số làm số nguyên không dấu. Hậu tố tương tự khác cũng tồn tại. Ví dụ, cho float 'f' được sử dụng.

+0

Không phải "một số trình biên dịch". Tất cả các trình biên dịch. – Lundin

+0

Tôi không muốn khái quát, vì cá nhân tôi chỉ sử dụng một vài trình biên dịch. – Mocha

+0

Điểm của tôi là tiêu chuẩn C thực thi trình biên dịch để xử lý một số nguyên mà không có 'u' như int đã ký. – Lundin

21

Các chữ số nguyên như 1 trong mã C luôn là loại int. int cũng giống như signed int. Một thêm u hoặc U (tương đương) vào chữ để đảm bảo nó không được ký, để ngăn chặn nhiều lỗi không mong muốn và hành vi lạ.

Một ví dụ về một lỗi như vậy:

Trên một máy 16-bit nơi int là 16 bit, biểu hiện này sẽ dẫn đến một giá trị âm:

long x = 30000 + 30000; 

Cả 30000 literals là int, và vì cả hai toán hạng là int, kết quả sẽ là int. Một int ký 16 bit chỉ có thể chứa các giá trị lên đến 32766, do đó nó sẽ tràn. x sẽ nhận được một giá trị âm, lạ vì điều này, thay vì 60000 như mong đợi.

long x = 30000u + 30000u; 

tuy nhiên sẽ cư xử như mong đợi.

+1

'biểu thức này sẽ dẫn đến giá trị âm'. Tốt hay quỷ sẽ bay ra khỏi mũi của bạn như là số nguyên tràn là hành vi không xác định. – ouah

+1

@ouah Theo lý thuyết có. Trong thế giới thực, tất cả các trình biên dịch tôi đã từng thấy xử lý tràn số nguyên theo cách tương tự. Dù sao, nó là một lỗi bất kể kết quả. – Lundin

+2

thực tế là số nguyên tràn là không xác định không chỉ là lý thuyết. Ngay cả trong thế giới thực, trình biên dịch tận dụng lợi thế của các số nguyên tràn là hành vi không xác định để thực hiện tối ưu hóa. Ví dụ 'gcc' có ít nhất 20 trường hợp mà nó không xem xét số nguyên tràn để bọc để nó có thể thực hiện tối ưu hóa. Một ví dụ đơn giản là một biểu thức như 'a - 8 <42', nếu' a' là một kiểu đã ký 'gcc' có thể làm giảm biểu thức thành' a <50'. – ouah