2010-11-17 30 views
39

Tôi rất mới để đối phó với bit và đã bị mắc kẹt trên các cảnh báo sau khi biên dịch:cảnh báo: trái đếm sự thay đổi> = chiều rộng của loại

7: warning: left shift count >= width of type 

dòng My 7 trông như thế này

unsigned long int x = 1 << 32; 

Điều này sẽ có ý nghĩa nếu kích thước long trên hệ thống của tôi là 32 bit. Tuy nhiên, sizeof(long) trả lại 8CHAR_BIT được định nghĩa là 8 cho thấy rằng thời lượng dài phải là 8x8 = 64 bit.

tôi thiếu gì ở đây? Có phải sizeofCHAR_BIT không chính xác hoặc tôi đã hiểu nhầm điều gì đó cơ bản không?

Trả lời

63

long có thể là loại 64 bit, nhưng 1 vẫn là int. Bạn cần phải thực hiện 1 một long int sử dụng L hậu tố:

unsigned long x = 1UL << 32; 

(Bạn cũng nên làm cho nó unsigned sử dụng U hậu tố như tôi đã thể hiện, để tránh những vấn đề của trái chuyển một số nguyên ký Không có vấn đề. khi một long rộng 64 bit và bạn thay đổi 32 bit, nhưng nó sẽ là một vấn đề nếu bạn chuyển 63 bit)

+0

Sẽ 'unsigned long x = 1; x << = 32; 'công việc, không quan tâm? –

+0

@Kolink: Vâng, điều đó sẽ có tác dụng tương tự, cũng như '(unsigned long) 1 << 32' Toán hạng trái chỉ phải là một 'unsigned long'. Hậu tố 'UL' chỉ là cách đơn giản nhất để thực hiện điều đó. –

+0

@ James McNellis: Các vấn đề * của __left__ chuyển số nguyên đã ký * là gì? Tôi chỉ biết rằng *** quyền *** chuyển một số nguyên có dấu có thể dẫn đến kết quả khác nhau với các trình biên dịch khác nhau. – pynexj

1

unsigned long x = 1UL < < 31;

Không hiển thị thông báo lỗi. Bởi vì trước khi bạn chỉ định 32, không đúng vì chỉ giới hạn ở 0-31.

0

Bạn không thể thay đổi một giá trị cho chút tối đa của nó

int x;   // let int be 4 bytes so max bits : 32 
x <<= 32; 

Vì vậy, điều này tạo ra các cảnh báo

left shift count >= width of type (i.e type = int = 32)

+0

Từ ngữ của bạn sai. Bạn ** có thể ** chuyển một '1' thành bit quan trọng nhất của kiểu của nó, nếu nó là' unsigned' hoặc nếu nó là 'signed' và có' INT_MIN == 1 << width - 1'. Nó chuyển * vượt ra ngoài * mà bit cao nhất có thể gây ra vấn đề. –

8

unsigned long là 32 bit hoặc 64 bit mà phụ thuộc vào hệ thống của bạn. unsigned long long luôn là 64 bit. Bạn nên làm điều đó như sau:

unsigned long long x = 1ULL << 32 
+1

IOW, đó là kích thước của hằng số 1 cho bạn vấn đề, chứ không phải x. – deStrangis

-1

Bạn có thể sử dụng một cái gì đó như thế:

unsigned long x = 1; 
x = x << 32; 
Các vấn đề liên quan