這道題你會做嗎

來源:互聯網
上載者:User

昨天在看程式員面試寶典這本書時,無意中看到了這麼一道題:題目中的程式大概是這樣的:

#include <stdio.h>int main(void){int a = -20;unsigned int b = 10;char c;(a + b > 6) ? (c = 1) : (c = 0);return c;}

題目要求讀這段程式,給出最後的結果。
看了一下,很簡單的一道題嘛,答案當然是0了,一看後面的答案,竟然錯了,然後繼續分析,看了好久還是沒看出哪錯了,於是動手寫了這段程式測試了一下,結果真的是0;

注意:在測試的時候不能使用printf("%d", a+b);來查看a+b的值,因為這個%d會將其結果轉換成整形輸出。剛開始我就犯了這樣的錯誤,後面就用C++中的cout又試了一下,這下結果卻不是-10了,而是4294967286,看到這個結果當時就淩亂了。然後就看了一下後面的解析,才發現:unsigned int類型的資料和int類型的資料在進行運算時,會將int類型的資料轉換為unsigned
int類型,再進行算術運算,在該程式中,int類型的-20轉換為unsigned int將是一個非常大的正整數,本身就已遠大於6了,所以最後的結果應該是c=1.

最後在網上也差了一下資料,發現在C語言中還有著這樣的規定:
在算數運算中,如果涉及到無符號數與有符號數之間的操作,編譯器會自動轉化為無符號數來進行處理!!!

自己寫了幾個小程式測試了一下,發現也確實是這樣的。

同時,在查資料的過程中,也發現了一篇關於C語言中的整數自動轉換原則的文章寫的不錯,推薦給大家。
http://blog.csdn.net/zhuimengzh/article/details/6728492

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.