30/09/2018, 19:36

Vấn đề dịch bit trong C/C++

Mình có đoạn code

void main()
{
	int a = 0;// 00000....
	a = ~a;// 11111....
	a = a >> 1;// Đáng lẽ phải ra 01111...
	cout << a;// kết quả là -1
	system("pause");
}

Tại sao không in ra giá trị dương lớn nhất của kiểu in mà lại là -1
Cảm ơn mọi người.

Linh viết 21:38 ngày 30/09/2018

Trong C/C++, phép dịch bit sang phải đối với kiểu int sẽ là arithmetic shift (các bit xuất hiện mới bên trái sẽ giống với giá trị bit cao nhất trước đó).

Còn phép dịch bit sang phải với kiểu unsigned sẽ là logical shift (các bit mới xuất hiện bên trái sẽ là số 0).

Với a kiểu int và a = a >> 1 thì các bit 1 sẽ dịch sang phải 1 vị trí, ví trí bit cao nhất sẽ có giá trị của bit cao nhất trước đó, tức là 111… (giá trị a vẫn không đổi). Và theo luật biểu diễn số nguyên có dấu theo nguyên tắc số bù hai thì số gồm toàn bit 1 sẽ biểu diễn cho -1.

Bài liên quan
0