1. 程式人生 > >關於C語言的隱式型別轉換

關於C語言的隱式型別轉換

這個問題,本來以為自己早已爛熟於胸了,但是一個測試程式還是把我給放倒了。

首先給出以下C語言預設的隱式轉換規則:

char,short --> int --> unsigned --> long --> double <-- float

OK, 這裡看起來好像也完全沒問題。我們接下來看一個簡單的小示例:

#include <stdio.h>

int main()
{
    unsigned short a = 1;
    unsigned short b = 0;
 
    if (a < (b-1)) //a和b-1的結果-1都被轉換為int型別進行比較,1<-1,顯然false
    {
        printf("in if\n");
    }

    return 0;
    
}

執行結果是啥?(先想想,看自己的判斷是不是對的)
// 結果啥也沒輸出

我們稍微改動一行,看看結果如何?
#include <stdio.h>

int main()
{
    unsigned short a = 1;
    unsigned int b = 0;
 
    if (a < (b-1)) //b-1的結果-1,被轉換為0xffffffff,1<0xffffffff,顯然true啊
    {
        printf("in if\n");
    }

    return 0;
    
}
這次執行結果呢?
[email protected]
:~$ ./a.out in if

if語句驗證通過。

從上面那個示例來看,我們應該怎麼想呢?

char,short型別,不管是否unsigned char, unsigned short,都會轉換為signed int型別,這是我的想法。

各位朋友,我的理解是否有誤呢?歡迎批評指正

相關推薦

C++:型別轉換和關鍵字explicit

《Inside the C++ Object Model》第二章開篇處有這樣一段話:“事實上關鍵字explicit之所以被匯入這個語言,就是為了給程式設計師提供一種方法,使他們能夠制止“單一引數的constructor”被當做一個conversion運算子”。 conversion運算子即型別

C#的型別轉換和顯型別轉換

C#的隱式型別轉換和顯式型別轉換 C#的隱式型別轉換     在C#語言中,一些預定義的資料型別之間存在著預定義的轉換。比如,從int型別轉換到long型別。C#語言中資料型別的轉換可以用分為兩 類:隱式轉換(implicit conversions)和顯式轉換(expli

徹底理解c++的型別轉換

隱式型別轉換可以說是我們的老朋友了,在程式碼裡我們或多或少都會依賴c++的隱式型別轉換。 然而不幸的是隱式型別轉換也是c++的一大坑點,稍不注意很容易寫出各種奇妙的bug。 因此我想借著本文來梳理一遍c++的隱式型別轉換,複習的同時也避免其他人踩到類似的坑。 本文索引 什麼是隱式型別

C語言進階學習1 型別轉換和強制型別轉換

本部落格記錄狄泰學院課程的學習 學習交流群:320628659 個人QQ:1367087622 歡迎大家交流學習 本章的學習目標: 學習隱式型別轉換和強制型別轉換的基本概念. 本意或非本意下使用型別轉換時可能會出現的問題. 在C語言是可以進行型別之間的轉換且其中存在兩種型別

關於C語言型別轉換

這個問題,本來以為自己早已爛熟於胸了,但是一個測試程式還是把我給放倒了。 首先給出以下C語言預設的隱式轉換規則: char,short --> int --> unsigned --> long --> double <-- float OK

C++型別轉換 operator

在Win32 SDK, 該API函式原型為 BOOL GetClientRect( HWND hWnd, // 視窗控制代碼 LPRECT lpRect // 客戶區座標 ); 在MFC中,該函式的原型為void

C++進階--型別轉換

//############################################################################ /* 隱式型別轉換 * * 型別轉換可分為: * 隱式

15 More Effectic C++ ——條款21/22(過載防止型別轉換/使用複合操作符)

1 看不見的隱式型別轉換 當建構函式只有一個,編譯器會利用建構函式進行隱式型別轉換。如下面所示: class UInt { public: UInt(); UInt(int value); } UInt a = 0, b(0), c = 1; // 隱式轉換:int變成UI

C++------型別轉換

隱式型別轉換的定義: “可以用 單個形參來呼叫 的建構函式定義了從 形參型別 到 該類型別 的一個隱式轉換。” 這裡應該注意的是, “可以用單個形參進行呼叫” 並不是指建構函式只能有一個形參,而是它可以有多個形參,但那些形參都是有預設實參的。 那麼,什麼是“隱式轉換”呢? 上面這句話也說了,

C++型別轉換建構函式和關鍵字explicit

轉自公眾號:碼農有道1. 隱式型別轉換建構函式:    在《C++ Primer》這本經典教程中提到:可以用單個實參來呼叫的建構函式定義從形參型別到該類型別的一個隱式轉換。這句話看起來比較繞口挺不好理解的。我們還是結合例項來理解。#include <iostream&g

從Qt談到C++(一):關鍵字explicit與型別轉換

提出疑問 當我們新建了一個Qt的widgets應用工程時。會自動生成一個框架,包含了幾個檔案。其中有個mainwindow.h的標頭檔案。就是你要操縱的UI主介面了。我們看看其中的一段程式碼: class MainWindow : public QMainWindow {

[c++基礎] 四種類型轉換型別轉換

static_cast<type-id >( expression )   用於數值型別之間的轉換,也可以用於指標之間的轉換,編譯時已經確定好,效率高,但須要自己保證其安全性。 (1)用於數值之間的轉化, 可以在相關指標在void* 之間轉換     (2)在

Mysql精度損失--型別轉換的坑

    今天在工作中遇到一個小問題,很不起眼的問題,但是很嚴重.就是mysql精度損失.    為什麼我們在進行mysql操作的時候要加引號呢?通常都是字串需要加引號,而數字就不需要加引號,但是這次我在純數字的字串中沒有加引號,所以問題就出現.  

一道有趣的JS題(1 - 妙用型別轉換

題目 輸入:var a = [1,[2,3],a,[b,c]]; 輸出:1,2,3,a,b,c 解決方法3種 1. 使用遞迴 function flat1(arr){ let res = []; if( Array.isArray(arr) ){ arr.for

JavaScript中的型別轉換

最近在學習渡一教育的JavaScript精品課,成哥講的還是很棒的,開這個系列記錄下學習筆記 本次學習筆記,對應web前端開發JavaScript精英課js的第六課時   目錄  一.is NaN()  二.++ -- 自增自減運算子 &nb

有趣的JavaScript型別轉換

---恢復內容開始--- 有趣的JavaScript隱式型別轉換 JavaScript的資料型別是非常弱的(不然不會叫它做弱型別語言了)!在使用算術運算子時,運算子兩邊的資料型別可以是任意的,比如,一個字串可以和數字相加。之所以不同的資料型別之間可以做運算,是因為JavaScript引擎在運算之前會悄悄的

MySQL型別轉換導致索引失效

今天發現一個問題,where條件的列上明明有索引,但是執行計劃還是走全表掃描 mysql>  explain select task_id FROM mostop_xiaodai_collection_call_auto WHE

Javascript 型別轉換規則

1. Javascript隱式型別轉換與Java的區別 一個Javascript表示式中包含不同型別的值進行運算時,可能會發生隱式型別轉換,也可能不轉換,隱式型別轉換規則與運算元,運算子都相關,這是與強型別語言(Java)不同的地方,Java隱式型別一般只與運算元相關,即表數範圍小的型別向表

Qt——QVariant型別轉換實現型別系統(Type System)

QVariant v(709); qDebug() << v.toInt(); QVariant w("How are you! "); qDebug()

JavaScript面試題大坑之型別轉換例項程式碼

1.1-隱式轉換介紹 在js中,當運算子在運算時,如果兩邊資料不統一,CPU就無法計算,這時我們編譯器會自動將運算子兩邊的資料做一個數據型別轉換,轉成一樣的資料型別再計算 這種無需程式設計師手動轉換,而由編譯器自動轉換的方式就稱為隱式轉換 例如1 > "0"這行程式碼在js中並不會報