大端小端與指針的關係?
======================以下為第二次補充=========================
我又想起來另一個事,問題的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&
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?