Từ 1 tới 7 trên tổng số 7 kết quả

Đề tài: Hỏi về little/big endian

  1. #1
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Mặc định Hỏi về little/big endian

    Em có CT thế này:
    Code:
    #include "stdafx.h"
    #include <utility.h>
    
    struct a
    {
    	BYTE b1;
    	BYTE b2;
    };
    
    a *b;
    int APIENTRY WinMain(HINSTANCE hInstance,
                         HINSTANCE hPrevInstance,
                         LPSTR     lpCmdLine,
                         int       nCmdShow)
    {
    	unsigned short c = 5457; //0x1551
    	b=(a*) &c;
    	show (b->b1); 
    	show (b->b2);
    	return 0;
    }
    Nhưng nó lại ra b1 là 0x51, b2 là 0x15,;
    Thế thì lúc gán cho c là nó ghi vào bộ nhớ theo thứ tự ngược, hay là lúc đọc ra struct a thì theo thứ tự ngược nhỉ ? Thực ra là nó đọc ghi thế nào ai nói rõ cho em với !!!
    Life:\> dir

  2. #2
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Mình xin viết lại code của hoanglinh thành như thế này cho dễ hiểu nhé (Xin phép đổi c = 0x1234):

    Code:
    #include <stdio.h>
    #include <conio.h>
    
    struct a {
    	char b1;
    	char b2;
    };
    
    void main()
    {
            a *b;
    	unsigned short c = 0x1234;
    	b = (a*) &c;
    	
    	printf("%x\n", b->b1); 
    	printf("%x\n", b->b2);
    	
    	getch();
    }
    Ban đầu c là unsigned short chiếm 2 byte trong bộ nhớ với cấu trúc trong bộ nhớ như sau [12][34]. Khi gán b = (a*) &c . Tức là cho b tham chiếu vào c => b là c và c là b => ko có chuyện "ghi vào bộ nhớ theo thứ tự ngược gì hết.

    Khi đọc b ra, nó sẽ đọc từ phải sang trái. Tức là đọc [34] trước, sau đó mới đọc [12].
    pEnGwINUS.

  3. #3
    Ngày gia nhập
    12 2007
    Bài viết
    224

    b = (a*) &c;
    Cho em thắc mắc tại sao phải thêm (a*) . Em bỏ thử và chạy thì kết quả cũng y chang mà .

  4. #4
    Ngày gia nhập
    01 2007
    Nơi ở
    Hải Phòng
    Bài viết
    210

    Cho em thắc mắc tại sao phải thêm (a*) . Em bỏ thử và chạy thì kết quả cũng y chang mà .
    Còn mình bỏ đi là khi compile báo lỗi liền à. Mình dùng VC++6 để dịch.

    error C2440: '=' : cannot convert from 'unsigned short *' to 'struct a *'
    Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
    pEnGwINUS.

  5. #5
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Hic, thế có ai biết về vụ little/big endian này ko giúp với !!!
    Life:\> dir

  6. #6
    Ngày gia nhập
    08 2006
    Nơi ở
    TpHCM
    Bài viết
    202

    Mặc định Hỏi về little/big endian

    Hi các cậu, chúc các cậu năm mới dồi dào sức khỏe,
    mới đầu năm mà các cậu tích cực học tập quá,

    Vấn đề hoanglinh hỏi chẳng liên quan gì đến little/big endian gì hết
    little/big endian liên quan đến code Unicode khi trữ vào file

    unsigned short c = 5457; //0x1551
    0x15: tại địa chỉ cao trong memory (trọng số cao ở địa chỉ cao)
    0x51 tại địa chỉ thấp trong memory
    đó là theo cách dịch của compiler VC với bộ xử lý toán của VXL pentium X86

    struct a {
    char b1;
    char b2;
    };
    b1: tại địa chỉ thấp (thứ tự trước ở địa chỉ thấp)
    b2: tại địa chỉ cao
    đó là theo cách dịch của VC

    Thế nên mới có kết quả như hoanglinh nêu

  7. #7
    Ngày gia nhập
    07 2006
    Nơi ở
    Hà nội
    Bài viết
    204

    Hiểu rồi cám ơn anh nguyentuan2 nhá !
    Life:\> dir

Các đề tài tương tự

  1. Cách chuyển đổi một số từ dạng Little Endian sang Big Endian
    Gửi bởi minhtuan.a0 trong diễn đàn Nhập môn lập trình C/C++
    Trả lời: 4
    Bài viết cuối: 07-12-2011, 10:15 PM
  2. Big and Little Endian Byte Order
    Gửi bởi icttrack trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 3
    Bài viết cuối: 03-03-2010, 12:15 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn