程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 大小端編程注意事項

大小端編程注意事項

編輯:關於C語言

一般情況下,我們所遇到的都是小端的情況,典型的X86處理器就是小端的。
 
但是,好多powerpc處理器可以被配置為大端模式,也可以被配置為小端模式。所以,經常會出現以前的代碼運行的好好地,到了新板子,或者板子配置
 
發生了變化,結果就不對了,而且很難調試。因為根本不會認為它出錯。
 
下面就舉個我們代碼中調了好久才發現的問題。
 
又一個函數:
 
i2c_write(..., unsigned char *reg, ...)
 
這裡的reg類型為一個unsigned char 型的指針,代表i2c設備的寄存器地址。
 
以前的代碼,在傳參數之前,會聲明一個類型為int的cTest, 然後做如下調用
 
i2c_write(..., (unsigned char *)&cTest, ...);
 
在以前的simba板子上,這樣做沒有出現任何問題。simba是一塊powerpc平台的MPC8572的板子,當時配置為小端模式。
 
是,小端的話這樣看來一般確實不會出現什麼問題。
 
比如
 
int cTest = 2;
 
也就是cTest = 0x00000002, 那麼傳進去的指針指向0x02所在的地址,也就是cTest的地址的最低一位。
 
現在換成tembo板子,tembo是一塊powerpc平台的P4080的板子,配置為大端模式。
 
仍然是
 
int cTest = 2;
 
也就是cTest = 0x00000002, 那麼現在傳進去的指針還指向0x02所在的地址嗎?
 
很顯然不是!
 
我們看(unsigned char *)&cTest 這個操作,這個C標准肯定有規定,將得到一個指向&cTest的最低地址的unsigned char型指針。
 
此時,&cTest的最低位在最高有效位,內容為0x00,所以,肯定不會得到正確的結果!
 
就這麼一個小小的問題,花了好久才得到解決。歸根結底,還是編程習慣導致的。
 
平常寫代碼太過隨意,也不管什麼平台,也不注意參數類型,其實,對於參數的定義,類型中的signed 和unsigned 最好帶上。
 
因為不能假設編譯器會認為char型到底是帶符號還是不帶符號,雖然大多情況下是帶符號的。
 
還有就是嚴格的參數傳遞,最好需要什麼類型的參數,就定義什麼類型的參數。不要對編譯器做任何假定!
 
 
 
 摘自 井朝天的專欄

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved