淺談防不勝防的unsigned int的運(yùn)算
我很早之前就知道,unsigned int與int運(yùn)算的時(shí)候,int會(huì)被轉(zhuǎn)化為unsigned int來(lái)進(jìn)行運(yùn)算。一直覺(jué)得定這條規(guī)則的人是極度反人類的,雖說(shuō)unsigned int可以表示更大的正值,但畢竟我們不太會(huì)把unsinged想像成一個(gè)負(fù)數(shù),而一個(gè)負(fù)的int數(shù)可能在無(wú)意間就變成了最大的正數(shù)。
所以,我對(duì)這個(gè)問(wèn)題很慎重。小心翼翼地,一直沒(méi)怎么出過(guò)錯(cuò)。直到有一天。
第一回合
那是一個(gè)陽(yáng)光明媚的午后,我正愜意地刷leetcode。要遍歷vector中除最后一個(gè)元素的所有元素。我這樣寫道:
for(int i=0;i<nums.size()-1;++i) bulabula;
沒(méi)什么錯(cuò)吧?沒(méi)錯(cuò)!提交的時(shí)候發(fā)現(xiàn)程序出現(xiàn)了內(nèi)存訪問(wèn)錯(cuò)誤。
作為一個(gè)自信的程序員,我自然想到了編譯器出了問(wèn)題。于是在VS上測(cè)試,是沒(méi)有問(wèn)題的!Stupid Leetcode!居然說(shuō)我的代碼有問(wèn)題,我的代碼怎么可能有問(wèn)題?
就在我要放棄這一題的時(shí)候,我突然想到了邊界條件,于是把nums清空再測(cè)試,VS提示內(nèi)存訪問(wèn)錯(cuò)誤。Soryy Leetcode,是在下輸了……
在進(jìn)行一番絞盡腦汁之后,我把目光聚焦在了size_t,查了資料后發(fā)現(xiàn),size_t就是個(gè)unsigned類型,恍然大悟……nums.size()-1就等于最大的正數(shù),i與之比較,肯定是符合條件的!OH NO!
第二回合
在經(jīng)歷了上述事情之后,我一般會(huì)這么寫程序:
for(int i=0;i<(int)nums.size()-1;++i) bulabula;
再也沒(méi)有出現(xiàn)過(guò)問(wèn)題。每次看到別人還寫我之前那樣的代碼,我都會(huì)會(huì)意一笑,然后告訴他人的我心得。直到有一天,我看到一個(gè)大牛寫了這樣的代碼:
for(int i=nums.size()-1;i>=0;--i) bulabula;
我想我發(fā)現(xiàn)了大牛的錯(cuò)誤。有了上次的教訓(xùn),這次我測(cè)試了一下邊界條件。什么?居然正常運(yùn)行?
在想了很久之后,我得出以下結(jié)論:nums.size()-1的確得到了一個(gè)最大的unsigned int,可是把它賦給int的時(shí)候,編譯器就傻傻地直接把unsigned int賦給了int,于是int就為-1了。大牛畢竟是大?!?/p>
在學(xué)知識(shí)的道路上總會(huì)有羊腸小道,多走一些羊腸小道,我才能知道有沒(méi)有近道!加油加油!
以上就是小編為大家?guī)?lái)的淺談防不勝防的unsigned int的運(yùn)算全部?jī)?nèi)容了,希望大家多多支持腳本之家~
相關(guān)文章
C++實(shí)現(xiàn)inline hook的原理及應(yīng)用實(shí)例
這篇文章主要介紹了C++實(shí)現(xiàn)inline hook的原理及應(yīng)用,需要的朋友可以參考下2014-08-08C語(yǔ)言程序設(shè)計(jì)第五版譚浩強(qiáng)課后答案(第二章答案)
這篇文章主要介紹了C語(yǔ)言程序設(shè)計(jì)第五版譚浩強(qiáng)課后答案(第二章答案),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2021-04-04C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)系列隊(duì)列篇
本章我們將學(xué)習(xí) "隊(duì)列" ,首先介紹隊(duì)列的概念和結(jié)構(gòu),然后我們將著重講解棧的實(shí)現(xiàn)。我們從零開(kāi)始寫隊(duì)列的接口,并從零開(kāi)始步步解讀。本章將繼續(xù)鞏固畫思路草圖的能力,只要思路草圖畫好了,就可以很輕松地將其轉(zhuǎn)換成代碼2022-02-02C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)流程
windows自帶的游戲《掃雷》是陪伴了無(wú)數(shù)人的經(jīng)典游戲,本文將利用C語(yǔ)言實(shí)現(xiàn)這一經(jīng)典的游戲,文中的示例代碼講解詳細(xì),感興趣的可以學(xué)習(xí)一下2022-05-05C++ Array容器的顯示和隱式實(shí)例化詳細(xì)介紹
這篇文章主要介紹了C++中Array容器的隱式實(shí)例化和顯式實(shí)例化,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧2022-10-10notepad介紹及插件cmake編譯過(guò)程(替代notepad++)
這篇文章主要介紹了notepad介紹及插件cmake編譯過(guò)程(替代notepad++),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03