青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Jiang's C++ Space

創(chuàng)作,也是一種學習的過程。

   :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
弄C++很多年了,沒想到還居然被這種問題所困,其實不光我了,問了幾個同道中人,都未能很好解釋為什么,不過我還是記錄一下,有知情人士看到的話不妨留言告知。

代碼是hello world級別的,很簡單:
int _tmain(int argc, _TCHAR* argv[])
{
    
int ni = 50;
    unsigned 
int ui = 100;
    
    printf(
"%d\n", ni-ui);
    printf(
"%d\n", (ni-ui)*2);
    printf(
"%d\n", (ni-ui)/2);
    printf(
"%d\n", (ni-(int)ui)/2);
    
return 0;
}
問題:輸出結果是什么?
我預期的輸出結果應該是這樣:
-50
-100
-25
-25
而事實上是:
-50
-100
2147483623
-25
在VC6,VS2005和VS2008上調試過,結果完全一致,這就表示,(ni-ui)/2的結果被認為是一個無符號整型,為什么會這樣呢?我看了一下反匯編……其實,我沒看明白。(匯編沒學好)

這種小問題可能會引發(fā)大問題,我最近在設計一個程序,把圖片貼到窗口上,圖片的寬和高被我設計為無符號的,因為寬和高最小為0,不可能是負數,而圖片的繪制位置則有可能是負數,這跟坐標系有關,這樣有符號和無符號之間就有可能出現了上面的那種操作,導致程序出現了一些怪異的行為,通過調試,發(fā)現是這個問題。

解決方法很簡單,只要加上一個強制轉換即可,像代碼最后一個printf語句那樣。但為什么這樣我就不太清楚了,是C++的規(guī)范,還是編譯器的問題,有其它編譯器的朋友可以試試看。
posted on 2010-06-12 10:43 Jiang Guogang 閱讀(2072) 評論(7)  編輯 收藏 引用 所屬分類: Knowledge

評論

# re: 怪異的有符號/無符號轉換問題 2010-06-12 10:46 mr.huang
太詭異。。。麻煩了。。。我們的工程都很少注意這些。  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-12 17:45 OwnWaterloo
printf("%d %u\n", ni-ui, ni-ui);
printf("%d %u\n", (ni-ui)*2, (ni-ui)*2);
printf("%d %u\n", (ni-ui)/2, (ni-ui)/2);
printf("%d %u\n", (ni-(int)ui)/2, (ni-(int)ui)/2);

觀察輸出結果, 明白了嗎?  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-13 10:07 博主
@OwnWaterloo
我的問題如文中所說,“是C++的規(guī)范,還是編譯器的問題”,(ni-ui)*2被認為是一個有符號的整型,而為什么(ni-ui)/2卻被認為是一個無符號整型,是C++的規(guī)范,還是編譯器的問題?  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-13 10:36 OwnWaterloo
@博主
規(guī)范。

二元操作符始終會將操作數轉換為同一類型計算。

轉換規(guī)則很復雜, 但有2點:

1. signed T的rank一定比unsigned T要低
2. int 剛好超過默認參數提升的范圍

所以 int op unsigned 一定是都轉換為unsignd計算。
  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-20 21:33 gejun
“(ni-ui)*2被認為是一個有符號的整型,而為什么(ni-

ui)/2卻被認為是一個無符號整型,是C++的規(guī)范,還是編

譯器的問題?”

hi,Jiang. 又在默默耕耘啦~~

請問你根據什么知道(ni-ui)*2被認為是一個有符號的整

型而(ni-ui)/2卻被認為是一個無符號整型?

如果你是根據printf("%d",XXX)的輸出,那就錯了。因為

printf("%d",XXX)不管XXX是什么類型都會把XXX當做有符

號數輸出的。

我做了個實驗證明之前那位網友所說,int op unsigned

一定是都轉換為unsignd,是對的。

(寫了段代碼來證明那位網友的結論:
unsigned int ui = 1;
int ni = 2;

if((ui - ni)<0){
//如果(ui - ni)被轉換為有符號數就會進入這

個分支
printf("should not see me.\n\r");
})

回到你說的問題。那輸出結果到底是什么?

把你代碼中的%d換成%x就真相大白了。

printf("%x\n", ni-ui);
printf("%x\n", (ni-ui)*2);
printf("%x\n", (ni-ui)/2);
printf("%x\n", (ni-(int)ui)/2);

輸出結果如下:
ffffffce
ffffff9c
7fffffe7
ffffffe7

那對于你說有問題的那兩句話,
(ni-ui)/2輸出為7fffffe7
(ni-(int)ui)/2)輸出為ffffffe7
為什么會有這個差異?
請看看匯編代碼。

在計算(ni-ui)/2時,編譯器使用shr來計算結果。shr是

邏輯右移,右移的同時高位填0,所以得到7fffffe7。
在計算(ni-(int)ui)/2時,編譯器使用sar來計算結果。

sar是算術右移,右移的同時保留符號位,所以得到

ffffffe7。

那為什么(ni-ui)/2采用shr而(ni-(int)ui)/2采用sar?
我想就像前面那位網友說的,(ni-ui)被轉換為無符號數

,所以編譯器采用shr忽略符號位;而(ni-(int)ui)被強

制轉換為有符號數,所以編譯器采用了sar以考慮符號位


  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-21 08:29 pmerofc
(ni-ui)*2被認為是一個有符號的整型,而為什么(ni-ui)/2卻被認為是一個無符號整型

(ni-ui)*2 , (ni-ui)/2 都是 unsigned

原因就是OwnWaterloo說的類型轉換

至于輸出-100,那完全是%d的緣故  回復  更多評論
  

# re: 怪異的有符號/無符號轉換問題 2010-06-21 15:58 博主
Thank you all.
我已經了解。總結回來就是:有符號和無符號的運算,必須要小心謹慎一些。  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲一区二区精品在线| 篠田优中文在线播放第一区| 亚洲影院一区| 91久久夜色精品国产九色| 久久精品国产99国产精品| 久久精品国内一区二区三区| 久久久久久久精| 久久免费精品视频| 你懂的国产精品| 91久久久久久| 亚洲性线免费观看视频成熟| 亚洲福利视频免费观看| 亚洲缚视频在线观看| 最新日韩欧美| 一区二区三区偷拍| 欧美在线视频免费| 蜜桃av一区二区| 亚洲人成网站在线观看播放| 一区二区三区三区在线| 亚洲欧美日韩在线高清直播| 欧美在线观看一二区| 欧美精品一区二区三区高清aⅴ| 欧美日韩免费一区二区三区| 国产精品一二| 亚洲人成在线观看网站高清| 亚洲一区999| 麻豆精品在线观看| 亚洲精品免费网站| 久久电影一区| 国产精品成人va在线观看| 国产中文一区二区| 一区二区三区 在线观看视频| 久久av老司机精品网站导航| 亚洲国产精品悠悠久久琪琪| 午夜影视日本亚洲欧洲精品| 欧美激情精品久久久久久大尺度| 国产精品丝袜白浆摸在线| 亚洲激情欧美激情| 久久乐国产精品| 亚洲视频综合在线| 欧美激情网友自拍| 一区免费观看| 久久gogo国模啪啪人体图| 91久久精品一区二区三区| 久久国产精品网站| 国产精品日韩| 制服丝袜激情欧洲亚洲| 欧美成人官网二区| 久久精品人人做人人爽| 国产精品一区二区视频| 一区二区三区精密机械公司| 欧美成人黄色小视频| 香蕉久久一区二区不卡无毒影院 | 一区二区三区欧美亚洲| 久久美女性网| 激情欧美国产欧美| 久热精品视频在线观看| 久久综合精品一区| 亚洲欧美日韩视频一区| 欧美图区在线视频| 一区二区三区精品视频| 亚洲福利视频一区| 蜜臀99久久精品久久久久久软件 | 亚洲麻豆视频| 欧美精品国产| 99精品国产在热久久| 亚洲成人在线网| 蜜臀91精品一区二区三区| 1024精品一区二区三区| 噜噜噜久久亚洲精品国产品小说| 欧美一区三区二区在线观看| 国产欧美一区二区三区另类精品 | 亚洲国产精品激情在线观看| 久久人人爽人人爽爽久久| 激情视频一区| 欧美激情第三页| 欧美韩国日本综合| 一区二区三区高清| 亚洲一级一区| 伊人成人网在线看| 亚洲国产精品一区二区www| 欧美成人午夜影院| 中国女人久久久| 西西人体一区二区| 伊人久久综合| 夜夜狂射影院欧美极品| 国产欧美日韩在线 | 99精品热视频| 亚洲天堂网站在线观看视频| 国产欧美一区二区精品性| 鲁鲁狠狠狠7777一区二区| 老色批av在线精品| 亚洲四色影视在线观看| 亚洲摸下面视频| 在线看日韩欧美| 亚洲乱码一区二区| 国产一区99| 亚洲人成在线观看| 欧美精品黄色| 国产性天天综合网| 欧美国产亚洲另类动漫| 欧美女同视频| 久久久久久亚洲综合影院红桃 | 亚洲国产精品t66y| 国产精品久久久久久妇女6080| 久久国产日韩| 欧美精品日韩www.p站| 久久国产色av| 欧美特黄一级大片| 亚洲欧美日韩在线| 99国产精品久久久| 国产精品美女一区二区在线观看| 午夜精品福利在线观看| 久久视频免费观看| 亚洲欧美视频| 欧美国产日韩精品| 久久精品国产免费观看| 欧美激情第1页| 鲁大师成人一区二区三区| 欧美日韩一区二区在线| 欧美sm视频| 国产亚洲欧美日韩日本| 99国产精品| 99re热这里只有精品视频| 久久另类ts人妖一区二区| 亚洲专区欧美专区| 欧美激情自拍| 欧美激情中文字幕一区二区| 国产一区二区成人| 香蕉成人久久| 欧美与黑人午夜性猛交久久久| 欧美精品一区二区三区很污很色的 | 欧美一区二区三区在线视频| 一区二区三区高清| 欧美全黄视频| 亚洲国产裸拍裸体视频在线观看乱了 | 亚洲国产成人精品女人久久久 | 亚洲国产日韩综合一区| 在线免费观看日韩欧美| 久久国内精品视频| 久久亚洲国产成人| 在线欧美福利| 欧美1区3d| 亚洲欧洲另类国产综合| 亚洲精品在线观看视频| 欧美 日韩 国产 一区| 亚洲成色999久久网站| 亚洲激情第一页| 欧美精品久久久久久久免费观看 | 亚洲一区二区三区精品动漫| 亚洲图片自拍偷拍| 欧美午夜欧美| 亚洲女女女同性video| 欧美在线关看| 在线观看日产精品| 欧美777四色影视在线| 亚洲人成在线播放| 亚洲综合精品一区二区| 欧美成人第一页| 亚洲视频在线观看三级| 亚洲高清不卡| 经典三级久久| 久久精品人人做人人综合 | 亚洲国产精品视频| 在线视频中文亚洲| 国产精品久久久久久久久婷婷| 亚洲午夜91| 久久亚洲捆绑美女| 亚洲精选中文字幕| 国产精品高潮久久| 欧美综合国产| 亚洲欧洲一区二区在线播放| 亚洲线精品一区二区三区八戒| 国产欧美韩日| 欧美成人免费视频| 亚洲女优在线| 亚洲黄色成人| 久久精品视频在线| 一区二区日本视频| 激情综合亚洲| 欧美日韩另类国产亚洲欧美一级| 午夜国产不卡在线观看视频| 欧美www在线| 欧美在线观看一区二区三区| 亚洲电影在线看| 国产视频精品xxxx| 欧美日韩国产成人精品| 久久久精品999| 亚洲视频欧洲视频| 欧美激情一区在线观看| 久久精品av麻豆的观看方式| 一本久久综合亚洲鲁鲁五月天| 国产资源精品在线观看| 欧美日韩在线播放三区四区| 久久综合久久综合这里只有精品| 亚洲自拍啪啪| 99精品久久| 亚洲欧洲在线观看| 欧美成人亚洲成人| 久久综合伊人|