警惕不同型別的整型變數相比較

2021-10-06 06:08:51 字數 1988 閱讀 6198

目錄

有符號提公升為無符號--錯誤 現象

解釋短整型提公升為長整型--僥倖的正常 現象

解釋2個常見的錯誤

size()返回uint

int乘法溢位

當乙個無符號整型和乙個有符號整型之間比較時,可能會出錯。看下面的**:

可見,雖然qdebug正確列印了左右兩邊的取值,但是比較結果錯誤。

根據《深入理解c++11》第2.3節:

右邊是有符號整型的-1,左邊是無符號整型的0,所以右邊要提公升為無符號。-1的二進位制表示偏偏又是無符號裡最大的數,所以比較結果是小於。

#include "mainwindow.h"

#include "ui_mainwindow.h"

#include mainwindow::mainwindow(qwidget *parent) :

qmainwindow(parent),

ui(new ui::mainwindow)

mainwindow::~mainwindow()

void mainwindow::on_btncompare_clicked()

執行效果:

可見,結果正常。

根據overflow - what is the default data type of number in c? - stack overflow

的解釋,

c語言標準認為整型常量,如1,2,3之類,預設是int型別。

所以iright - 1是乙個有符號短整型與乙個int的減法。

由於qint16短於int(32位元)所以iright-1最後被提公升為int型的-1.左邊的ileft是quint16的0,也被提公升為int 的0 .所以0>-1。

for(int k = -1; k < vector.size();k++)

std::vector::size()返回無符號整型,所以-1被提公升為無符號,變成了乙個很大的正數。故這樣的迴圈永遠無法命中。

由於1024,和2都沒有明確指明其型別,預設是int。所以相乘結果也是int。最終結果超越了int的表示範圍,故報錯。

現在稍加改動,把最後的2改為2ul。1024*1024*1024的結果雖然是int型別,但是並不超越int的最大值。再與2ul相乘,得數提公升為unsigned int,也就避免了溢位,故不報錯。

不同型別變數與零值比較

1 布林變數與零值比較 不可將布林變數直接與 true false 或者 1 0 進行比較。根據布林型別的語義,零值為 假 記為 false 任何非零值都是 真 記為true true 的值究竟是什麼並沒有統一的標準。例如 visual c 將 true 定義為 1,而 visual basic 則...

不同型別的資料進行比較

參考5.built in types中的說明,cpython按照如下規則進行比較 自己的總結 任何兩個物件都可以比較 相同型別的物件 例項 如果是數字型 int float long complex 則按照簡單的大小來比較 如果是非數字型,且類 型 中定義了 cmp 含 gt lt 等 則按照 cm...

不同型別光學透鏡的比較

最近經常接觸各種透鏡,把常見透鏡的特性用處簡單整理一下。日後又新的認識了再來補充。一些基本概念是要知道的比如光軸,焦距,主點 主平面 凸 凹 透鏡成像規則。透鏡也有正負之分,這取決於它是使光線匯聚還是發散。常見的正透鏡包括雙凸透鏡 平凸透鏡以及月牙凸 凸面和凹面曲線相似,中心厚於邊緣 雙凸 曲率越高...