Đoạn mã sau xuất ra 0,1,32,33. Mà là truy cập trực quan để nói rằng ít nhất. Nhưng nếu tôi thay thế chữ 1 bằng loại hằng số được kết hợp "ONE", vòng lặp sẽ chạy tốt.Lỗi trình biên dịch bit dịch chuyển hoặc trường hợp góc?
Điều này là với gcc 4.6.2 và -std = C++ 0x.
#include<iostream>
#include<cstdint>
using namespace std;
int main()
{
int64_t bitmask = 3;
int64_t k;
const int64_t ONE = 1;
cout<<"bitmask = "<<bitmask<<endl;
for(k=0; k<64; k++)
{
if(bitmask & (1<<k))
{
cout<<"k="<<k<<endl;
}
}
return 0;
}
EDIT Câu hỏi: Như Ben chỉ ra, 1 được xem là rộng 32 bit theo mặc định. Tại sao nó không được phát triển đến 64 bit khi nó là hợp tác và là 64 bit.
SOLUTION
số < < không yêu cầu mỗi bên có cùng loại. Sau khi tất cả, tại sao làm cho phía bên phải một int64_t khi sự thay đổi tối đa có sẵn phù hợp trong một char? Chương trình khuyến mãi chỉ xảy ra khi bạn giao dịch với các toán tử số học, không phải tất cả các toán tử.
sao chép từ ý kiến của Bill dưới đây
bản sao có thể có của [Làm thế nào để tôi dịch chuyển bit dài hơn 32 bit?] (Http://stackoverflow.com/questions/2404439/how-do-i-bit-shift-a-long-by- nhiều hơn 32 bit) –