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
Bài liên quan
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
Hic. Ko có ai hết ạ
thì là do cách hỏi của em thôi, có ai hiểu được đâu @_@
Em chụp màn hình lỗi up lên xem nào
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
(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
Đú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 )
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 ạ.
cho a xem source code đi