30/09/2018, 18:20

*(unsigned *)(void *) &n nghĩa là gì?

mọi người xem giúp em code này, code này là chuyển đổi số thực sang mã nhị phân.

#include <iostream>
using namespace std;

void nhiphan(unsigned n)
{
    n >> 1 ? nhiphan(n >> 1) : 0;
	cout << (n & 1);
}

void nhiphan(float n)
{
	nhiphan(*(unsigned *)(void*)&n);
}

int main()
{
	nhiphan(3.9f);
	system("pause");
	return 0;
}

cho em hỏi là *(unsigned *)(void *) &n nghĩa là gì ạ???
với lại n >> 1 theo em biết là phép dịch chuyển bit sang phải, nghĩa là chia cho 2 ^ 1, vậy khi nào thì nó nhận giá trị âm ạ…Mong mọi người giúp em… Em cảm ơn ạ…

... viết 20:31 ngày 30/09/2018

n >> 1

Theo trang này: http://www.learncpp.com/cpp-tutorial/38-bitwise-operators/
thì toán tử dịch bit có kết quả trả về là giá trị sau khi dịch bit.

void nhiphan(unsigned n)
{

n >> 1 ? nhiphan(n >> 1) : 0;
cout << (n & 1);

}

Thế nên hàm này dùng giá trị trả về đó để kiểm tra xem khi nào n >> 1 còn khác 0
thì còn đệ quy với hàm

void nhiphan(unsigned int n);

Trong hàm

void nhiphan(float n);

các bước thực hiện từ phải qua trái như sau:

  • Tham chiếu đến tận ô nhớ của n.
  • Ép về con trỏ kiểu void (Theo mình hiểu thì từ con trỏ kiểu void có thể ép về nhiều kiểu con trỏ khác nhau, cái này nhờ anh @ltd confirm lại phát).
  • Từ kiểu con trỏ void ép về kiểu con trỏ số nguyên không dấu là unsigned int.
  • Dùng dấu * để lấy giá trị mà con trỏ đó trỏ tới.
  • Giá trị đó sẽ được đưa vào hàm
void nhiphan(unsigned);

Nếu với câu trả lời này mà bạn vẫn chưa hiểu, có thể do bạn thiếu kiến thức về con trỏ và đệ quy. Nếu thế thì bạn cần tìm hiểu 2 khái niệm con trỏ và đệ quy trước khi đọc code này.

Mai Anh Dũng viết 20:24 ngày 30/09/2018
  • Ép về con trỏ kiểu void (Theo mình hiểu thì từ con trỏ kiểu void có thể ép về nhiều kiểu con trỏ khác nhau, cái này nhờ anh @ltd confirm lại phát).

Con trỏ có kích thước bằng nhau, không phụ thuộc vào kiểu dữ liệu nên ép kiểu thoải mái

Phan Thành Nam viết 20:30 ngày 30/09/2018

yeap…cảm ơn anh, em đã thông, cảm ơn 2 anh nhiều ạ … ở trường em mới dạy con trỏ nhưng thầy dạy ít quá, em nghe nói con trỏ mạnh nhưng lại rất khó nên em muốn tìm hiểu rõ về nó…

Phan Thành Nam viết 20:24 ngày 30/09/2018

anh ơi… em chạy dòng code này:
‘’’

float a = 3.9;	  
cout << *(unsigned *)(void *)&a << endl;

‘’’

kết quả: 1081711002

em tưởng nó là 3 chứ… vì mình ép về kiểu `unsigned. Nhưng với kết quả này em nghĩ là không phải, anh có thể cho em biết kết quả nó trả về là gì ko ạ?

Bài liên quan
0