01/10/2018, 00:35

Lỗi kiểu dữ liệu lập trình C trên Linux

Chào mọi người. Em đang làm 1 project bằng C trên Linux nhưng gặp phải một vấn đề.
Em dùng hàm bswap_16 GNU, truyền vào tham số x kiểu dữ liệu là unsigned short. Nhưng trong quá trình thực hiện gọi hàm này thì nó thông báo lỗi kiểu dữ liệu. Cụ thể là trong thân hàm x>>8 và x&0xff bị lỗi. Em không muốn sửa trong thân hàm vì hàm này có sẵn. Anh và các bạn có hướng giải quyết nào giúp em với ạ.
Cám ơn nhiều

Melancholy viết 02:42 ngày 01/10/2018

Ví dụ như này cho dễ ạ. Giá trị unsigned short x đưa vào hàm bswap_16.
Trong hàm sẽ thực hiện ((((x) & 0xff) << 8) | ((x) >> 8)). Em không hiểu vì sao 0xff với 8 lại tự động mang kiểu unsigned int khiến sau khi thực hiện phép toán trên được kết quả là unsigned int trong khi mong muốn là unsigned short. Với điều kiện là không được chỉnh sửa thân hàm thì làm sao để giải quyết vấn đề này được ạ. huhu

Melancholy viết 02:46 ngày 01/10/2018

Hic. Ko có ai hết ạ

Lập Trình Sư viết 02:36 ngày 01/10/2018

Hic. Ko có ai hết ạ

thì là do cách hỏi của em thôi, có ai hiểu được đâu @_@

Nguyễn Văn Tâm viết 02:44 ngày 01/10/2018

Em chụp màn hình lỗi up lên xem nào

Nguyễn Xuân Phúc viết 02:49 ngày 01/10/2018

vấn đề có lẽ nằm ở default type của C/C++
thường thì default integer number sẽ là int và unsigned int. Thì ở đây sẽ xảy ra 2 quá trình

  • Nó nhận 0xff là 1 int
  • Với hầu hết kiến trúc hiện tại, int tương đương với long, nghĩa là lớn hơn short, vì vậy (x) & 0xff sẽ tự ép kiểu x sang int và biểu thức trả về là int, tương tự với >> 8 (không biết có phải là >> không, nếu không thì <> là toán tử gì :-? ) Như vậy kết quả là int.

Nhưng có 1 vấn đề? sao bạn biết nó là unsigned int mà không phải là int?
p/s: lần sau bạn cố gắng nói rõ câu hỏi và giải thích rõ, chứ ghi thế này, mình commend có 2p mà hiểu được câu hỏi của bạn mất 20p

Melancholy viết 02:39 ngày 01/10/2018

Đúng như vậy đó ạ. Em debug nó hiện lên bug là (x)&0xff không thể chuyển về kiểu unsigned short từ unsigned int. Nội dung hàm bswap_16 như này ạ.: (unsigned short int)((((x)>>8)&0xff) | ((x&0xff)<<8))

__(toán tử “>>” và ‘<<’ là dịch phải và dịch trái ạ.
Em dốt văn lắm nên diễn tả hơi khó hiểu )

Melancholy viết 02:42 ngày 01/10/2018

Em định ép kiểu cho 8 và 0xff nhưng nó nằm trong hàm có sẵn nên ko được sửa ạ. Giờ anh có cách gì chuyển mấy cái kiểu dữ liệu của 8 và 0xff về unsigned short không ạ.

Nguyễn Xuân Phúc viết 02:48 ngày 01/10/2018

cho a xem source code đi

Bài liên quan
0