我正在嘗試獲取位元組和指標以及它們的存盤方式,任何人都可以解釋或回答我的一些問題。謝謝
int num = 513; <-- allocating a 4 bit memory by initializing
//[01][02][00][00] <-- (numbers are sorted and shown as litle endian)
char * ptr = # //char is (one byte)
↓
//[01][02][00][00]
// pointer always start from the [0] (as in this array byte length)
// in the allocated address in the memory ptr[0] is in this case = [01]
// (printed as %x02 "printf("the byte x\n",ptr[0]);" - if it's only
//single number 1 a zero will be added on the length so it prints out as 01)
int * ptr = # //now creating a pointer with the type of int (four bytes)
↓ ↓ ↓ ↓
//[01][02][00][00]
- 我怎樣才能訪問這個 int 指標的第一個位元組?[問題01]
- 有沒有辦法查看第一個位元組([01])內部的咬痕?[問題02]
- 指標在哪里保存地址?它是否必須在 ram 中分配一個記憶體空間來保存地址,例如 0x233828ff21,如果是這樣,這個(0x233828ff21)地址需要很多位元組?[問題03]
- 這個 int 指標在哪里存盤它的型別長度(4 位元組)?[問題05]
- 如果我宣告具有更長位元組記憶體分配的型別,例如
long long * ptr = #[01][02][00][00][00][00][00][00] 會發生什么,因為我將 long long 指向 4 位元組 int ,最后這 4 個是否已經被另一個程式分配并正在使用中?我可以讀嗎?[問題06] - 二進制只有 0 和 1,其中一個(0 或 1)是否稱為咬?[問題07]
- 一個位元組是8位對嗎?為什么我在轉換本網站(https://www.rapidtables.com/convert/number/decimal-to-binary.html)中的數字1時得到16位0000000000000001不應該是8?[問題08]
uj5u.com熱心網友回復:
注意:char * ptr = #確實應該unsigned char * ptr = (unsigned char *)#避免編譯器警告并確保位元組被視為無符號值。
我怎樣才能訪問這個 int 指標的第一個位元組?[問題01]
如果你真的想訪問指標的第一個位元組,你可以使用:
unsigned char *ptr2 = (unsigned char *)&ptr;
然后ptr2[0]是指標的第一個位元組ptr。
有沒有辦法查看第一個位元組([01])內部的咬痕?[問題02]
我假設您的意思是第一個位元組內的位。位不能直接尋址,因此您需要一個運算式(通常使用按位運算子)來獲取每個位的值。例如,(ptr[m] >> n) & 1將是物件的第m個位元組的第n位的值(其中是指向物件開頭的 a)。ptrunsigned char *
指標在哪里保存地址?它是否必須在 ram 中分配一個記憶體空間來保存地址,例如 0x233828ff21,如果是這樣,這個(0x233828ff21)地址需要很多位元組?[問題03]
地址存盤在指標變數中的方式與數字存盤在數字型別變數中的方式相同。在 CPU 指令級別,存盤的指標值和存盤的整數值之間沒有區別,除了寬度。
指標型別的最典型大小是 8 位元組或 4 位元組,具體取決于編譯器的目標體系結構。
(沒有問題04。)
這個 int 指標在哪里存盤它的型別長度(4 位元組)?[問題05]
它不存盤型別的長度,但編譯器知道 aTYPE *指向一個sizeof(TYPE)位元組長的物件。
如果我宣告一個具有更長位元組記憶體分配的型別,例如 long long * ptr = # [01][02][00][00][00][00][00][00],會發生什么,因為我指向的是 long long 到 4 位元組 int,最后 4 個是否已經被另一個程式分配并正在使用?我可以讀嗎?[問題06]
如果指標未針對參考的型別 ( long long) 正確對齊,則行為未定義。否則可以轉換回原來的指標型別int *。在任何情況下,訪問*ptr都會導致未定義的行為(除非long long寬度與 相同int,這不是典型的)。
二進制只有 0 和 1,其中一個(0 或 1)是否稱為咬?[問題07]
它被稱為位。還有一種型別叫做_Bool. 型別運算式_Bool的值始終為 0 或 1。
一個位元組是8位對嗎?為什么我在轉換本網站(https://www.rapidtables.com/convert/number/decimal-to-binary.html)中的數字1時得到16位0000000000000001不應該是8?[問題08]
誰在乎一些隨機的網站顯示什么?
C 所稱的“位元組”是任何為 1 的型別,sizeof(type)包括和。它至少有8 位寬,但在某些特殊系統上比 8 位寬。charsigned charunsigned char
字符型別 ( char *,signed char *或unsigned char *) 的指標可用于訪問任何物件中的單個位元組,但對于其他大小為 1 型別的指標可能不正確,對于指向_Bool( _Bool *) 的指標當然也不正確!
uj5u.com熱心網友回復:
? 如何訪問這個 int 指標的第一個位元組?[問題01]
通常,最好使用unsigned char而不是char訪問任意位元組,所以讓我們這樣做。
之后unsigned char *ptr = #,ptr是指向 的指標,您可以使用orunsigned char訪問 的第一個位元組,如.int*ptrptr[0]printf("The first byte, in hexadecimal, is 0xhhx.\n", *ptr);
相反,如果您有int *ptr = #,則無法直接訪問第一個位元組。ptr這是一個指向 的指標int,并且,要訪問單個位元組,您需要指向一個unsigned char或其他單位元組型別的指標。您可以轉換ptr為指向 的指標unsigned char,就像使用 一樣(unsigned char *) ptr,然后您可以使用 訪問單個位元組* (unsigned char *) ptr。
? 有沒有辦法查看第一個位元組([01])內部的咬痕?[問題02]
C 標準不提供顯示位元組的各個位的方法。通常程式員以十六進制列印值,如上所述,并從十六進制數字中讀取位。您還可以撰寫自己的例程從位元組寫入二進制輸出。
? 指標將地址保存在哪里?它是否必須在 ram 中分配一個記憶體空間來保存地址,例如 0x233828ff21,如果是這樣,這個(0x233828ff21)地址需要很多位元組?[問題03]
指標是一個變數,就像你的其他變數int和char變數一樣。它在記憶體中有自己的空間來存盤它的值。(這種具有記憶體的變數模型用于指定 C 程式的行為。當程式被編譯器優化時,它可能會改變這一點。)
在當前系統中,指標通常是 32 位或 64 位(四個或八個 8 位位元組),具體取決于目標體系結構。您可以通過printf("The size of a 'char *' is %zu bytes.\n", sizeof (char *));. (C 標準允許不同型別的指標具有不同的大小,但這在現代 C 實作中很少見。)
? 這個int 指標在哪里存盤它的型別長度(4 位元組)?[問題05]
編譯器知道指標的大小。指標本身不存盤它所指向的事物的長度。當您使用指標時,編譯器只會生成適當的代碼。如果*ptr用來獲取指標所指向的值,編譯器會生成一個型別為ptris的加載位元組指令,它會生成一個型別為ischar *的加載四位元組指令(and is 4 bytes in你的 C 實作)。ptrint *int
? 如果我宣告具有更長位元組記憶體分配的型別,例如 long long * ptr = # [01][02][00][00][00][00][00][00],會發生什么,因為我指向的是long long 到 4 位元組 int,最后這 4 個是否已經被另一個程式分配并正在使用?我可以讀嗎?[問題06]
當long long是一個八位元組整數,并且您有一個long long *ptr指向四位元組整數時,C 標準沒有定義當您嘗試使用*ptr.
在通用多用戶作業系統中,后面的記憶體int不能被另一個程式分配(除非這個程式和另一個程式都安排共享記憶體)。每個行程都有自己的虛擬地址空間,它們的記憶體是分開的。
long long *ptr在您的程式中使用它可能會訪問超出int. 這可能會導致程式中出現各種型別的錯誤,包括資料損壞和對齊錯誤。
? 二進制只有0 和1,其中一個(0 或1)是否稱為咬?[問題07]
一個二進制數字是一個“位”。多個二進制數字是“位”。
特定計算機作為一個單元進行操作的最小位組是“位元組”。一個位元組的大小可以變化;早期的計算機有不同大小的位元組。現代計算機幾乎都使用八位位元組。
如果您的程式包含 header <limits.h>,它將定義一個名為的宏,該宏CHAR_BIT提供一個位元組中的位數。在幾乎所有現代 C 實作中它是 8。
? 一個位元組是 8 位,對嗎?為什么我在轉換本網站(https://www.rapidtables.com/convert/number/decimal-to-binary.html)中的數字1時得到16位0000000000000001不應該是8?[問題08]
該網站不僅僅是轉換為一個位元組。
它似乎顯示至少 16 位,選擇 16、32 或 64 位中的最小值,該值適合作為有符號整數型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/410135.html
標籤:
