[問題] 不用memcpy的情況下,給不同型態變數值

看板C_and_CPP作者 (陣內家的孩子)時間8年前 (2015/08/18 23:55), 8年前編輯推噓6(6018)
留言24則, 7人參與, 最新討論串1/1
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) DevC++ 問題(Question): 在不用memcpy的情況下, 我想把整數x的內容設給字元陣列y. 目前的想法是直接把x的位置設給y,但編譯時會出現以下error. incompatible types in assignment of `char*' to `char[4]' 還有什麼辦法可以把x的值設給y嗎? 感謝. 程式碼(Code):(請善用置底文網頁, 記得排版) #include <stdio.h> #include <string.h> int main() { int x = 0x55555555; char y[4]; y = (char *)&x; return 0; } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 118.233.74.51 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1439913312.A.D27.html ※ 編輯: nimura14 (118.233.74.51), 08/18/2015 23:55:42

08/18 23:59, , 1F
*((int*)&y)=x;
08/18 23:59, 1F
感謝回覆! ^^ y是指向該陣列的頭的位置對吧? 再取址的意義是什麼呢?

08/19 00:06, , 2F
可以耶...為什麼呢?
08/19 00:06, 2F

08/19 00:07, , 3F
我試過用*y = x;也可以, 可是不懂為什麼.
08/19 00:07, 3F
※ 編輯: nimura14 (118.233.74.51), 08/19/2015 00:15:59

08/19 00:17, , 4F
*(int*)y = x ;
08/19 00:17, 4F

08/19 00:21, , 5F
y[0] = 0xFF & x ; y[1] = 0xFF00 & x ;
08/19 00:21, 5F

08/19 00:22, , 6F
y[2] = 0xFF0000 & x ; y[3] = 0xFF000000 & x;
08/19 00:22, 6F

08/19 00:24, , 7F
寫錯了,應該用>>操作,練習看看吧
08/19 00:24, 7F

08/19 00:27, , 8F
用union也可以,方法一大堆
08/19 00:27, 8F

08/19 00:30, , 9F
謝謝回覆!!
08/19 00:30, 9F

08/19 00:36, , 10F
這種操作要注意的應該是 big/little endian
08/19 00:36, 10F

08/19 00:37, , 11F
y與&y雖然知道的位置一樣 但type不同 我為了轉型較合理
08/19 00:37, 11F

08/19 00:37, , 12F
上面兩種方法在 little endian 情況下都是反的
08/19 00:37, 12F

08/19 00:37, , 13F
感謝deitchie, 我會研究看看, 真的學習了! 剛剛看了一下...第一次知道這個事實.... y的type是char * &y的type是char *[4] y和&y雖然位置一樣, 但是做記憶體運算時結果可是大不同...謝謝指教了!感謝 感謝EdisonX, 謝謝提醒!! 感謝stupid0319提供的1 byte 1byte搬的方式~~ ※ 編輯: nimura14 (118.233.74.51), 08/19/2015 00:45:12

08/19 00:58, , 14F
假如編譯器是GCC的話可以用個神奇的指令做位元反轉
08/19 00:58, 14F

08/19 00:58, , 15F
*((int*)&y)=__builtin_bswap32(x);
08/19 00:58, 15F

08/19 00:59, , 16F
舊版的不確定是否有該內建指令就是了
08/19 00:59, 16F
※ 編輯: nimura14 (118.233.74.51), 08/19/2015 01:05:24

08/19 01:07, , 17F
謝謝喔!我會去看看GCC的__builtin_bswap32()
08/19 01:07, 17F
剛剛還試過以下2個方式,結果都正確, 但是觀念怪怪的 1. y[0]=x; 直接把整數x的value設給字元陣列的第一個元素. 這個方式我覺得最怪,整數是4byte, 字元是1byte, 這樣的assign方式不會溢位嗎? 2. *y = x ; 這個方式沒有做牆制型態轉換, 但結果也是對的, 編譯器也沒warning. 是因為編譯器自己幫我做了型態轉換嗎? ※ 編輯: nimura14 (118.233.74.51), 08/19/2015 01:08:15

08/19 01:55, , 18F
1.int 轉成 char 存到 y[0] 2. array dereference,未定義
08/19 01:55, 18F

08/19 19:11, , 19F
2沒有warning嗎?回家試試
08/19 19:11, 19F

08/21 02:26, , 20F
兩個都是沒問題的唷
08/21 02:26, 20F

08/21 02:27, , 21F
1跟2都做了轉型為char再寫到陣列第一個元素的位置
08/21 02:27, 21F

08/21 02:30, , 22F
如果eax現在是0x00656463,那這兩行做的都是mov byte
08/21 02:30, 22F

08/21 02:30, , 23F
ptr [ebp-4], al,al是eax的
08/21 02:30, 23F

08/21 02:31, , 24F
最低byte,也就是這裡的0x63
08/21 02:31, 24F
文章代碼(AID): #1LqrLWqd (C_and_CPP)