大端小端與指針的關係?

======================以下為第二次補充=========================

我又想起來另一個事,問題的input是一個整數,要判斷整數是不是迴文;我說可以用c自帶的itoa這個函數先轉成字元串來判斷迴文,是不是itoa這個函數的實現涉及到大端小端了?

======================以下為第一次補充=========================

補充一下面試時的代碼,面試時的代碼大概是這樣:

bool func(char* text)
{
char* front = text;
char* tail = text;
while(*tail) tail++;

while(tail &>= front) {
if (*front != *tail) {
break;
}
front++;
tail--;
}
if (tail &< front) return true; else return false; }

沒調試過,對不對先不說,就是大概這個思路這麼寫的。

=======================以下為原文======================================

大端小端在變數的類型cast的時候有可能會有問題,比如int轉為char,有可能是取了int的低位,也有可能是取了int的高位,但是對於指針操作內存來說存在大端小端的說法嗎?比如下面這段代碼會不會因為機器不同,ptr++得改為ptr--才能正確執行?

char text[5] = "12345";
char *ptr = text;

while (*ptr) {
cout &<&< *ptr; ptr++; }

這個問題的背景是我去參加某個公司面試,讓我在黑板上寫一個判斷迴文字元串的函數,我寫了一個這樣操作指針的方法,然後面試官跟我說這樣在大端小端機器上可能會有問題,所以想問一下指針的++和--也跟大端小端有關嗎(沒涉及類型cast)?


整數類型static_cast不會有位元組序問題。

指針++和--操作不涉及casting和位元組序問題。

把指針類型reinterpret_cast才會有位元組序問題,例如:

int a = 0x12345678;
char* c = reinterpret_cast&(a);
printf("%x %x %x %x
", c[0], c[1], c[2], c[3]);
// 小端輸出:78 56 34 12
// 大端輸出: 12 34 56 78

使用union做轉換也有同樣問題:

union {
int a;
char c[4];
}u;
u.a = 0x12345678;
printf("%x %x %x %x
", u.c[0], u.c[1], u.c[2], u.c[3]);
// 小端輸出:78 56 34 12
// 大端輸出: 12 34 56 78

另外,常見的位元組序問題通常涉及讀寫內存外的數據,例如文件、網路流等。


面試官在胡說。


哪個公司,曝一下。防止後人入坑。


這個倒是第一次聽說,我倒是做過ARM的程序,應該不需要的,大端小端最多只在CPU位寬範圍內有效,就是CPU如何理解一段內存


難道發送位元組流裡面包含指針,好陰險的計謀。。。


沒關係


大端小端在變數的類型cast的時候有可能會有問題,比如int轉為char,有可能是取了int的低位,

很難說。

int 轉為 char 不會有大小端問題,只存在可能溢出的問題。

但int *轉為char *會有。

比如下面這段代碼會不會因為機器不同,ptr++得改為ptr--才能正確執行?

絕對不需要。

補充一下面試時的代碼,面試時的代碼大概是這樣:

bool func(char* text)
{
char* front = text;
char* tail = text;
while(*tail) tail++;

while(tail &>= front) {
if (*front != *tail) {
break;
}
front++;
tail--;
}
if (tail &< front) return true; else return false; }

沒調試過,對不對先不說,就是大概這個思路這麼寫的。

代碼有不少錯誤,不過不存在大小端問題。

我又想起來另一個事,問題的input是一個整數,要判斷整數是不是迴文;我說可以用c自帶的itoa這個函數先轉成字元串來判斷迴文,是不是itoa這個函數的實現涉及到大端小端了?

用itoa()有些笨拙,不過不涉及大小端。


推薦閱讀:

為什麼 C 語言的輸入輸出函數比 C++ 的輸入輸出流要快?
有沒有比較好的自學IT的網站?適用於不管是初學者還是其他段位的程序猿的網站?
如何評價2016年藍橋杯決賽?
C++ 是否適合做 GUI?

TAG:CC | 指針 | 體系結構 |