30/09/2018, 19:04

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 ?

*grab popcorn* viết 21:04 ngày 30/09/2018


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

Văn Dương viết 21:19 ngày 30/09/2018

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];}
} 
Chí Cường Trần viết 21:04 ngày 30/09/2018

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

*grab popcorn* viết 21:17 ngày 30/09/2018

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

hung222 viết 21:06 ngày 30/09/2018

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

Văn Dương viết 21:18 ngày 30/09/2018

Báo lỗi luôn nè

*grab popcorn* viết 21:11 ngày 30/09/2018

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

Chí Cường Trần viết 21:13 ngày 30/09/2018

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

dihocke viết 21:18 ngày 30/09/2018

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ì?

*grab popcorn* viết 21:10 ngày 30/09/2018

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

Gió viết 21:18 ngày 30/09/2018

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

明玉 viết 21:11 ngày 30/09/2018

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.

Văn Dương viết 21:16 ngày 30/09/2018

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.

Văn Dương viết 21:17 ngày 30/09/2018

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);
Killua viết 21:13 ngày 30/09/2018

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
#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;
Văn Dương viết 21:07 ngày 30/09/2018

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;
}
Killua viết 21:08 ngày 30/09/2018

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;
}

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

Văn Dương viết 21:11 ngày 30/09/2018

Đú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].

Bài liên quan
0