C專家程式設計讀書筆記 型別轉換

2021-07-31 16:06:13 字數 2112 閱讀 5645

最近又拜讀了一遍c專家程式設計,發現還是有的問題點沒有注意到-自動型別轉換,直接上**

#include int arry = ;

#define total (sizeof(arry)/sizeof(arry[0]))

int main()

else

}

輸出結果是:

結果很出人意料吧?

此一段程式牽扯到以前從沒注意的兩個問題點:

1.window 程式在記憶體中以補碼的形式存在

2.c語言自動型別轉換

分別回顧下問題點:

1.原碼,反碼,補碼和移碼回顧

原碼:

如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位:正數為0,負數為1。剩下的n-1位表示概數的絕對值。

例如: x=+101011 , [x]原= 00101011   

x=-101011 , [x]原= 10101011 

位數不夠的用0補全。

ps:正數的原、反、補碼都一樣:0的原碼跟反碼都有兩個,因為這裡0被分為+0和-0。

反碼:

知道了什麼是原碼,那反碼就更是張飛吃豆芽——小菜一碟了。知道了原碼,那麼你只需要具備區分0跟1的能力就可以輕鬆求出反碼,為什麼呢?因為反碼就是在原碼的基礎上,符號位不變其他位按位取反(就是0變1,1變0)就可以了。

例如:x=-101011 , [x]原= 10101011 ,[x]反=11010100

補碼:

補碼也非常的簡單就是在反碼的基礎上按照正常的加法運算加1。

例如:x=-101011 , [x]原= 10

101011

,[x]反=11010100,[x]補=11010101

ps:0的補碼是唯一的,如果機器字長為8那麼[0]補=00000000。

移碼:

移碼最簡單了,不管正負數,只要將其補碼的符號位取反即可。

例如:x=-101011 , [x]原= 10

101011

,[x]反=11010100,[x]補=11010101,[x]移=01010101

所以-1的

原碼二進位制是:1000 0000 0000 0000 0000 0000 0000 0001

反碼二進位制是:1111 1111 1111 1111 1111 1111 1111 1110

補碼二進位制是:1111 1111 1111 1111 1111 1111 1111 1111

即是:0xff ff ff ff

記憶體中的表示形式為:

2.型別自動轉換

1) 轉換規則是:

自動型別轉換遵循下面的規則:

若參與運算的資料型別不同,則先轉換成同一型別,然後進行運算。

轉換按資料長度增加的方向進行,以保證精度不降低。例如int型和long型運算時,先把int量轉成long型後再進行運算。

所有的浮點運算都是以雙精度進行的,即使僅含float單精度量運算的表示式,也要先轉換成double型,再作運算。

char型和short型參與運算時,必須先轉換成int型。

在賦值運算中,賦值號兩邊的資料型別不同時,需要把右邊表示式的型別將轉換為左邊變數的型別。如果右邊表示式的資料型別長度比左邊長時,將丟失一部分資料,這樣會降低精度。

下圖表示了型別自動轉換的規則:

綜上所述:

以上列印結果為:> 就不奇怪了

原因是:sizeof 返回的是unisgned int型別,所以total為unsigned int型別

if(d < total)的時候,強制把d轉換為unsigned int型別,本來值為-1此時變成0xff ff ff ff,當然輸出》

《C 專家程式設計》讀書筆記

前言 程式設計挑戰 計算機日期 第二章 這不是bug,而是語言特徵 switch的乙個bug break中斷了什麼 第三章 分析c語言宣告 程式設計挑戰 把c 語言的宣告翻譯成通俗的語言 include include include include define max len 100 enum ...

《C專家程式設計》讀書筆記

第一章 const float 表示乙個指向float型別常量的指標 第二章 1.在c語言中const並非真正表示 常量 在陣列定義與case中不可以使用 2.case的一些問題 2 3 main 15 這段 列印出來的是 3.函式可見性 void sb any where 2 extern voi...

《C專家程式設計》讀書筆記9

第九章 再論陣列 宣告本身還可以進一步分成3種情況 外部宣告 external array 的宣告。陣列的定義 記住,定義是宣告的一種特殊情況,它分配記憶體空間,並可能提供乙個初始值 函式引數的宣告。所有作為函式引數的陣列名總是可以通過編譯器轉換為指標。作為函式定義的形式引數,char s和 cha...