ansi c中的整型公升級
char,short int或者int型位段(bit-field),包括它們的有符號或無符號變型,
以及列舉型別,可以使用在需要int或unsigned int的表示式中,
如果int可以完整地表示源型別的所有值,那麼該型別的值就轉換為int,否則轉換為unsigned int。
ansi c中的尋常算術轉換
當執行算術運算時,運算元的型別如果不同,就會發生轉換。
資料型別一般朝著浮點精度更高、長度更長的方向轉換,
整型數如果轉換為signed不會丟失資訊,就轉換為signed,否則就轉換為unsigned。
這個稱為值保留(value preserving)原則,與k&r c所採用的無符號保留(unsigned preserving)原則不同。
int d = -1;
if (d <= sizeof(arr)/sizeof(arr[0]))
...這樣的比較語句有問題,sizeof運算子返回無符號數。
if語句在signed int和unsigned int之間測試相等性,
按照上面的說法,可以這樣解釋:
首先,signed int和unsigned int長度相同,不會向更長的方向轉換。
其次,signed int不能完整地表示unsigned int的所有值。
因此,signed int d被轉換為unsigned int型別。
這樣,-1就變成乙個非常巨大的正整數,導致比較結果與預期的不符。
解決的方法是使用強制轉換,(int)(sizeof(arr)/sizeof(arr[0]))。
我在vc++ 6.0和dev-c++ 4.9.9.0中嘗試了上面那段**,的確如此。
不要因為無符號數不存在負值而用它表示數量(如年齡、國債等),
盡量使用int之類的有符號數,這樣在混合運算中,
這樣就不必擔心邊界情況(如-1被翻譯為非常大的正數)。
只有在使用位段和二進位制掩碼時,才使用無符號數。
應該在表示式中使用強制型別轉換,使所有的運算元均為有符號數或無符號數,
這樣就不必由編譯器來選擇結果的型別。
c語言中的型別轉換比一般人想象中的要廣泛得多。
在涉及型別小於int或double的表示式中,都有可能出現型別轉換。
printf(" %d ", sizeof 'a');
的結果是4, 是int的長度。
整型提公升就是char、short int和位段型別(無論signed或unsigned)以及列舉型別將被提公升為int,
前提是int 能夠完整地容納原先的資料,否則將被轉換為unsigned int。
ansi c表示,如果編譯器能夠保證運算結果一致,
也可以省略型別提公升——這通常出現在表示式中存在常量運算元的時候。
另乙個會發生隱式型別轉換的地方就是引數傳遞。
在k&r c中,由於函式的引數也是表示式,所以也會發生型別提公升。
在ansi c中,如果使用了適當的函式原型,型別提公升便不會發生,否則也會發生。
在被呼叫函式的內部,提公升後的引數被裁減為原先宣告的大小。
這就是為什麼單個的printf()格式字串%d能適用於幾個不同型別,
short、char或int,而不論實際傳遞的是上述型別的哪乙個。
函式從堆疊中(或暫存器中)取出的引數總是int類,並在printf或其他被呼叫函式裡按統一的格式處理。
printf是乙個可變引數函式,此時一般的引數提公升始終會發生。
原型之痛
ansi c函式原型的目的是使c語言成為一種更加可靠的語言。
建立原型就是為了消除形參和實參之間的型別不匹配。
如果使用了函式原型,預設引數提公升就不會發生。
如果引數宣告為char,則實際傳遞的也是char。
如何進行強制型別轉換,為何要進行型別強制轉換
「強制型別轉換(cast)」這個術語從c語言一誕生就開始使用,
既用於「型別轉換」,也用於「消除型別歧義」。
(float)3 是乙個型別轉換,而且資料的實際二進位制位發生了改變,
(float)3.0 用於消除型別歧義,這樣編譯器可以從一開始就選擇正確的位模式。
有些人認為它之所以命名為強制型別轉換是因為它們可以把有些東西變得不完整。
C整型公升級和尋常算術轉換以及資料型別轉換
一 在算術表示式中存在整型公升級和尋常算術轉化問題 unsigned char,unsigned short unsigned int float double long double float double long double為浮點型資料。當沒有浮點型資料參與計算時,統一轉為 unsigne...
C專家程式設計 整型提公升與尋常算術轉換
1 字元和整型 整型提公升 如果char short int或者int型位段 bit field 包括它們有符號或無符號變型,以及列舉型別,可以使用在需要int或者unsigned int的表示式中。如果int可以完整表示源型別的所有值,那麼該源型別的值就轉換為int,否則轉換為unsigned i...
javascript 整型轉換
在判斷字串是否是數字值前,parseint 和parsefloat 都會仔細分析該字串。parseint 方法首先檢視位置0處的 字元,判斷它是否是個有效數字 如果不是,該方法將返回nan,不再繼續執行其他操作。但如果該字元是有效數字,該方法將檢視位置1處的字元,進行同樣的測試。這一過程將持續到發現...