大小端程式設計注意事項

2021-12-29 23:01:19 字數 1126 閱讀 1628

一般情況下,我們所遇到的都是小端的情況,典型的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.一般資料都要分頁,請直接加上分頁 3.重複性資料的校驗 介面接收資料 1.介面接收資料,一般型別接受 例如 string 列印日誌,之後再轉換成自己想要的格式json等。需求評審 問題一 大面問題 1.是什麼?2.怎樣玩?業務流程...

移動端注意事項

移動端 1,高度不是按百分比設定,而是直接設定高度px或者em,百分比容易變形 2,寬度按照百分比來衡量 3,一般父級div不直接設定寬高,而是由子級div撐起來 4,對相同元素不同機型樣式適配用 查詢,即 media 推薦文章 1 查詢1 2 查詢25,如何讓子級div相對於父級div垂直居中 p...

VBA程式設計 注意事項

1 在自定義函式前加上 private 關鍵字進行宣告,該函式將不會出現在 excel的 貼上函式 對話方塊中,但仍然可以在公式中運用它們。如果是專門為其他的 vba過程開發的自定義函式,則應該使用 private 關鍵字進行宣告。2 通常,使用者自定義函式後,在 貼上函式 對話方塊中將會出現在 使...