[問題] C的printf輸出memory location問題

看板C_and_CPP (C/C++)作者 (神汁手)時間10年前 (2016/01/10 03:14), 10年前編輯推噓2(203)
留言5則, 2人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) Code Block 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 預期按位元輸出該記憶體位址(by byte)的值,但得到亂數ffffffff 詳見下方 餵入的資料(Input): 255 預期的正確結果(Expected Output): 前面部分是測試碼所以省略 後面輸入255 預期會得出 (記憶體位址) ff (記憶體位址) 00 (記憶體位址) 00 (記憶體位址) 00 錯誤結果(Wrong Output): (記憶體位址) ffffffff (記憶體位址) 00 (記憶體位址) 00 (記憶體位址) 00 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> void printByte(char*, int); void printInt(int); void main() { char c; int i; int ex; scanf("%c %d",&c, &ex); //printf("%p is the original location\n", &a); // for (i = 0; i < 4; i++) printByte(&c, sizeof(i)); printInt(ex); //printByte(&a, i); return; } void printByte(char* a, int len) { int i; printf("\n"); for(i = 0; i < len; i++) { printf("%p\t%.2x\n", a + i, *(a + i)); } } void printInt(int s) { printByte((char*)&s, sizeof(s)); } 補充說明(Supplement): 我不知道為何輸出一個byte為何會輸出八位 如果輸入12345 會得到: (記憶體位址) 39 (記憶體位址) 30 (記憶體位址) 00 (記憶體位址) 00 這是正確的 但輸出某些數字,例如:1234567 就會得到 (記憶體位址) ffffff87 (記憶體位址) ffffffd6 (記憶體位址) 12 (記憶體位址) 00 1234567轉為16進位是12D687 所以基本上這個是正確的結果,但不曉得為何前面會多出一堆f 但有時會出現,有時又不會...... 感謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 36.238.205.157 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1452366873.A.671.html ※ 編輯: kiwistar (36.238.205.157), 01/10/2016 03:16:03 ※ 編輯: kiwistar (36.238.205.157), 01/10/2016 03:34:55

01/10 03:54, , 1F
前面會出現f是因為signed extension
01/10 03:54, 1F

01/10 03:57, , 2F
後來我發現,只要輸入的數字 &256>=128就會出現那堆f
01/10 03:57, 2F

01/10 04:01, , 3F
改成void printByte(unsigned char* a, int len)
01/10 04:01, 3F

01/10 04:02, , 4F
*(a + i)的值只有1byte, %x是int有4byte
01/10 04:02, 4F

01/10 04:42, , 5F
原來如此,google了一下,我懂了,感謝!!
01/10 04:42, 5F
文章代碼(AID): #1MaLmPPn (C_and_CPP)
文章代碼(AID): #1MaLmPPn (C_and_CPP)