Gán dữ liệu của mảng char X[4] vào biến int A(4 byte)

Chào các bạn, Mình có thắc mắc thế này:
Mảng char X[4] có 4 phần tử( mỗi phần tử 1 byte) tổng cộng 4 byte và biến kiểu int cũng có 4 byte, vậy cho mình hỏi cách nào để chuyển 4 byte của mảng vào biến int ?

:dizzy_face:
Ôi trời.
Tạo 1 con trỏ kiểu int, trỏ vào đó là đc. :)

2 Likes

1 kiểu int, 1 kiểu char trỏ được không nhỉ ?

Mình làm kiểu này :

unsigned char CH[4];
unsigned int IN;

void GetValue()
{
    IN=0;
    IN|=CH[0];
    IN<<=8;
    IN|=CH[1];
    IN<<=8;
    IN|=CH[2];
    IN<<=8;
    IN|=CH[3];}
} 
1 Like

Đang hóng câu trả lời

trỏ cò bay thẳng cánh luôn :stuck_out_tongue:
Và nó lấy luôn 1 block 4byte từ địa chỉ luôn
http://ideone.com/A9y4OB

4 Likes

Cảm ơn bạn nhiều lắm mình làm được rồi: :grinning:

Báo lỗi luôn nè :stuck_out_tongue:

2 Likes

a thôi.
ko phải &a :slight_smile:
(code sai tí :stuck_out_tongue: )
mà cái vs nó kỹ thật nhỉ :penguin:

2 Likes

sao mình vẫn bị lỗi nè bạn

Theo như mình biết thì đâu có thể tạo ra con trỏ kiểu int để trỏ vào 1 vùng có kiểu char đc nhỉ -_- , mà rốt cuộc là làm thế để làm gì?

Hmmm, v là cái này tùy vào compiler rồi :grimacing:
Thôi thì cứ làm nhu bạn Dương_Act là ổn nhất (y)

3 Likes

Cast sang int* là dc:
int * p=(int ) a*;
a==&a vì đây là mảng cố định nên địa chỉ của a cũng là của mảng

1 Like

Làm thế này cho nó an toàn:

char a[] = {1, 2, 3, 4};
int b = *(int*)a;

Còn nếu bạn sợ pointer thì:

char a[] = {1, 2, 3, 4};
int b;
memcpy(&b, a, 4);
// nếu bạn xài Visual Studio thì có thể thay bằng lệnh này cho nó khỏi kêu ca:
memcpy_s(&b, 4, a, 4);

và thế là b không dính dáng gì tới a nữa.

2 Likes

Mình thử đoạn này :

unsigned char CH[4];
unsigned int RI=10;

void GetValue()
{
    CH[0]=0;
    CH[1]=0;
    CH[2]=255;
    CH[3]=255;
    unsigned int *p=(unsigned int*)CH;
    RI=*p;
    printf("%d",RI);
    getchar();
}

Kết quả xuất ra màn hình là 0. Lẽ ra phải là 65535. Mình có kiểm tra thấy *p = 0.

1 Like

Mình in ra unsigned int cơ mà. Làm gì có chuyện int ra 1 byte đầu.

unsigned int RI=10;
printf("%d",RI);
1 Like

Mình đọc nhầm (mà xóa cmt rồi mà nhỉ ) ,mình dùng hàm cout thì nó vẫn ra đúng giá trị ,có thể do sai ở %d vì mình dùng printf thì in sai

#include <iostream>
#include <stdio.h>
using namespace std;
int main(int argc, char *argv[])
{
	unsigned char a[4]={0,0,255,255};

	unsigned int *p=(unsigned int*)a;
	for(int i=0;i<32;i++)
	{
		unsigned int temp=*p;
		temp=temp&(0x01<<i);
		if(temp==0)
		cout<<temp;
		else
		cout<<1;
	}
	cout<<endl<<*p<<endl;
	printf("%d",*p);//chỗ nãy %u thì ra đúng
	return 0;

Mình dùng như sau :

unsigned char CH[4];
int main()
{
    CH[0] = 0;
    CH[1] = 0;
    CH[2] = 0;
    CH[3] = 1;
    unsigned int *p = (unsigned int*)CH;
    unsigned int i = *p;
    //printf("%u", *p); => ra kết quả sai
    //printf("%u", p); => ra kết quả sai
    //printf("%u", i); => ra kết quả sai
    //printf("%d", *p); => ra kết quả sai
    //printf("%d", p); => ra kết quả sai
    //printf("%d", i); => ra kết quả sai
    getchar();
    return 0;
}
1 Like

Mình mới kiểm tra 1 dòng [printf("%u", *p) ] ,thấy kết quả đúng mà , *p của nó lúc này là 0000 0001 0000 0000 0000 0000 0000 0000, bạn tính ra nó là 16777216 ,mấy cái sau thì sai kiểu nên nó sai rồi ,chỉ có dòng %u là đúng kiểu

Đúng rồi.
Nãy giờ vẫn đang nghĩ mục đích sắp xếp theo kiểu CH[0]->CH[1]->CH[2]->CH[3]. :smile:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?