Thông thường, C yêu cầu toán hạng toán tử nhị phân được thăng cấp thành loại toán hạng cao hơn. Điều này có thể được khai thác để tránh điền mã với dàn diễn viên tiết, ví dụ:Bitshift và quảng bá số nguyên?
if (x-48U<10) ...
y = x+0ULL << 40;
, vv
Tuy nhiên, tôi đã phát hiện ra rằng, ít nhất là với gcc, hành vi này không làm việc cho bitshifts. I E.
int x = 1;
unsigned long long y = x << 32ULL;
tôi mong chờ các loại của toán hạng bên phải để làm cho toán hạng bên trái để được thăng unsigned long long
để sự thay đổi thành công. Nhưng thay vào đó, gcc in cảnh báo:
warning: left shift count >= width of type
Gcc bị hỏng hoặc tiêu chuẩn có ngoại lệ với quy tắc quảng bá loại cho bithifts không?
Quảng cáo có được quảng cáo không, bất kể cảnh báo? (nó chỉ là một cảnh báo, sau khi tất cả). –
Bạn không thể sử dụng một macro ngắn để tạo ra đoạn dài dòng? Giống như '#define ULL (x) ((unsigned long long) x)'? – Borealid
@Robert: Không, nó tạo ra no-op, như thể tôi đã viết đồng bằng '<< 32'. @Borealid: Vâng tôi có thể, nhưng tôi thích viết mã có thể được sao chép và dán bất kỳ nơi nào (ví dụ: các dự án khác) mà không yêu cầu thêm định nghĩa/tiêu đề. Tôi ghét những thứ như 'typedef unsigned int uint;'. –