我們都知道char型變數佔乙個位元組,int型占用4個位元組,long占用8個位元組,double型變數佔8個位元組,那麼這些變數和指標在計算機中儲存在哪個位址單元呢?
#include /* $end show-bytes */
#include #include /* $begin show-bytes */
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start, size_t len)
void show_int(int x)
void show_float(float x)
void show_pointer(void *x)
void test_show_bytes(int val)
void ******_show_a()
void ******_show_b()
void float_eg()
void string_ueg()
void string_leg()
void show_twocomp()
int main(int argc, char *ar**)
else
return 0;
}
結果如下:
hxl@hxl-virtual-machine:~/桌面/task/code$ ./sh
calling show_twocomp
0x7ffd77301fc4 0x39
0x7ffd77301fc5 0x30
0x7ffd77301fc6 0xc7
0x7ffd77301fc7 0xcf
calling ******_show_a
0x7ffd77301fbc 0x21
0x7ffd77301fbc 0x21
0x7ffd77301fbd 0x43
0x7ffd77301fbc 0x21
0x7ffd77301fbd 0x43
0x7ffd77301fbe 0x65
calling ******_show_b
0x7ffd77301fbc 0x78
0x7ffd77301fbc 0x78
0x7ffd77301fbd 0x56
0x7ffd77301fbc 0x78
0x7ffd77301fbd 0x56
0x7ffd77301fbe 0x34
calling float_eg
for x = 3490593
0x7ffd77301f9c 0x21
0x7ffd77301f9d 0x43
0x7ffd77301f9e 0x35
0x7ffd77301f9f 0x00
0x7ffd77301f9c 0x84
0x7ffd77301f9d 0x0c
0x7ffd77301f9e 0x55
0x7ffd77301f9f 0x4a
for x = 3510593
0x7ffd77301f9c 0x41
0x7ffd77301f9d 0x91
0x7ffd77301f9e 0x35
0x7ffd77301f9f 0x00
0x7ffd77301f9c 0x04
0x7ffd77301f9d 0x45
0x7ffd77301f9e 0x56
0x7ffd77301f9f 0x4a
calling string_ueg
0x55dc9b616d34 0x41
0x55dc9b616d35 0x42
0x55dc9b616d36 0x43
0x55dc9b616d37 0x44
0x55dc9b616d38 0x45
0x55dc9b616d39 0x46
calling string_leg
0x55dc9b616d3b 0x61
0x55dc9b616d3c 0x62
0x55dc9b616d3d 0x63
0x55dc9b616d3e 0x64
0x55dc9b616d3f 0x65
0x55dc9b616d40 0x66
hxl@hxl-virtual-machine:~/桌面/task/code$ ./sh 1
calling test_show_bytes
stack variable ival = 1
(int)ival:
0x7fff1c97f40c 0x01
0x7fff1c97f40d 0x00
0x7fff1c97f40e 0x00
0x7fff1c97f40f 0x00
(float)ival:
0x7fff1c97f40c 0x00
0x7fff1c97f40d 0x00
0x7fff1c97f40e 0x80
0x7fff1c97f40f 0x3f
&ival:
0x7fff1c97f408 0x34
0x7fff1c97f409 0xf4
0x7fff1c97f40a 0x97
0x7fff1c97f40b 0x1c
0x7fff1c97f40c 0xff
0x7fff1c97f40d 0x7f
0x7fff1c97f40e 0x00
0x7fff1c97f40f 0x00
解釋一下**執行結果。不帶引數執行時,呼叫show_twocomp()函式,這個函式再呼叫 show_bytes()函式,因為定義的是short型變數x=12345;轉化成16進製制是0x3039,則在計算機中就是0x30放在高位址區域,0x39放在低位址區域,這就是常說的小端模式,資料高有效部分放在高位址區域。同樣的-12345儲存時也是如此,需要注意的就是負數在計算機中儲存是用補碼表示,轉化成16進製制就是0xcfc7,後面**也是如此,需要注意的就是,64位機指標是8個位元組的,而且輸出時如果高位址對應的資料高有效區位數不足,則需要用0x00來存。
再要說的就是浮點數在計算機中的儲存,浮點數在64位機上一位表示符號,11位表示階碼,52位表示尾數,對於規格化的浮點數,11位階碼是由原數轉換成2進製後通過移動小數點,來獲得1.******x *2的n次方或者0.******x *2的n次方,此時階碼等於n+偏移量,偏移量=2的階碼-1次方-1,尾數就寫小數點後面的,最後寫成16進製制形式,按照小端模式儲存。其餘執行結果都可按照類似得出。
關於C 和C語言中一些變數和輸入輸出細節
對於c c 來說,最主要的型別也就是整型 浮點型 字元型這三種,對於每乙個型別又有不同的條線下的使用型別。整型又可以分為int 也陳偉long int short short基本用不到 long long。對於這三種變數型別,其長度也不同。值得注意的是在刷題中對於條件的把握。例如甲級題目中有一道題,...
C語言中一些基本問題
其中的u為unsigned,l為long,f為float c語言中常量的默情況 整形預設為有符號int 浮點型預設為double 如果整形常量大小超出int,預設自然就為long int 如果需要無符號整形常量的話就可以在常量後面加u或是u,如0u或是0u,同理可以在常量後面加ul或ul表示無符號長...
C語言中一些知識點
1.學程式設計 找 讀 改 寫 少看書。但少看不是不看,看一本書要限制在一天內。任務是通讀書中主要的概念,明白大致是幹什麼用的,形成乙個大概的框架 然後一周內乾掉書中全部 不理解再瀏覽書中相關章節,注意是瀏覽。或者刷部落格。實在刷不懂,可以先刷後面,待日後重新刷 因為書中 有些部分可能出自後面的章節...