1. 程式人生 > >整型提升(integer promotion)

整型提升(integer promotion)

什麼是integer promotion:

Integer Promotions

Integer types smaller than int are promoted when an operation is performed on them. If all values of the original type can be represented as an int, the value of the smaller type is converted to an int; otherwise, it is converted to an unsigned int.

Integer promotions are applied as part of the usual arithmetic conversions

(discussed later in this section) to certain argument expressions, operands of the unary +, -, and ~ operators, and operands of the shift operators. The following code fragment illustrates the use of integer promotions:

char c1, c2;
c1 = c1 + c2;

Integer promotions require the promotion value of each variable (c1

and c2) to int size. The two ints are added and the sum truncated to fit into the char type.

Integer promotions are performed to avoid arithmetic errors resulting from the overflow of intermediate values. On line 5 of Figure 5-7, the value of c1 is added to the value of c2. The sum of these values is then added to the value of c3

(according to operator precedence rules). The addition of c1 and c2 would result in an overflow of the signed char type because the result of the operation exceeds the maximum size of signed char. Because of integer promotions, however, c1, c2, and c3 are each converted to integers and the overall expression is successfully evaluated. The resulting value is then truncated and stored in cresult. Because the result is in the range of the signed char type, the truncation does not result in lost data.

Figure 5-7. Preventing arithmetic errors with implicit conversions
1. char cresult, c1, c2, c3;
2. c1 = 100;
3. c2 = 90;
4. c3 = -120;
5. cresult = c1 + c2 + c3;

更多例子:

1. 這個例子來自: http://blog.csdn.net/dyllove98/article/details/9004872

開門見山,先來看一段簡單的程式碼:

  1 #include <stdio.h>
  2 
  3 int array[] = {1, 2, 3, 4, 5, 6, 7};
  4 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
  5 
  6 int main()
  7 {
  8     int i = -1;
  9     int x;
 10 
 11     if(i <= TOTAL_ELEMENTS - 2) {               //整型提升
 12         x = array[i + 1];
 13         printf("x = %d.\n", x);
 14     }
 15 
 16     printf("now i = %d.\n", TOTAL_ELEMENTS);
 17 
 18     return 0;
 19 }

執行結果:

[email protected]:~/C_Language$ ./a.out 

now i = 7.

是不是很奇怪?為什麼沒有打出line13的x = ?。

是這樣的。這個小例子有三點值得注意:

1.sizeof()是運算子,返回型別是無符號的,即非負數。

2.if語句在singned int和unsigned int之間進行判斷語句,根據C語言整型提升規則,如果原始型別的所有值都可用int型別表示,則其值將被轉換為int型別;否則將被轉換為unsigned int型別。因此此時的i將會被升級成無符號型別。

3.i = -1被升級為無符號型,值究竟是多少?這要用到整型轉換規則:K&R上這樣解釋,將任何整數轉換為某種指定的無符號數型別數的方法是:以該無符號數型別能夠表示的最大值加1為摸,找出與此整數同餘的最小的非負值。聽著很拗口,其實說白了,只要知道原整數的二進位制表達方法,再用要即將轉換的型別去解析,就得到升級後的值了。 比如-1,負數在計算機裡用補碼錶示,0xffffffff,那升級成無符號型之後,值就是0xffffffff,顯然比TOTAL_ELEMENTS(7)大。


相關推薦

提升integer promotion

什麼是integer promotion: Integer Promotions Integer types smaller than int are promoted when an operation is performed on them. If all v

C++之羅馬數字轉換為數字12---《那些奇怪的演算法》

參考《one-day-one-leetcode》 在上篇部落格中我們討論了將1~3999以內的數字轉化為羅馬數字,著重討論了非7個標準的羅馬數字的一些表達,例如4,6,3等等的表達,這篇部落格我們著討

[轉載]Linux後門理合集脈搏推薦

整理 體系 子進程 目標 司機 nbsp 客戶 瀏覽器 -perm 我在思考要不要聯系下....都禁止轉載了.... 簡介 利用 Unix/Linux 自帶的 Bash 和 Crond 實現遠控功能,保持反彈上線到公網機器。 利用方法 先創建 /etc/xxxx

基礎數據類元祖

數據 spa als 適用於 字符 ron false 只讀 print 元組被稱為只讀列表,即數據可以被查詢,但不能被修改,所以,字符串的切片操作同樣適用於元組。 # t = (1,2,3,‘adsf‘,True,[12,3,‘苑昊‘,‘taibai‘],(‘fdsa‘

IDEA學習系列之IDEA裏項目的任意目錄進行類標註五種自定義這個知識點非常非常重要,必須會 圖文詳解

找到 關註 軟件 多說 微信公眾 提示 log 反饋 問題   不多說,直接上幹貨! 前言   對項目的任意目錄進行這五種目錄類型標註,這個知識點非常非常重要,必須會。   1、File ->

Kaggle Master解釋梯度提升Gradient Boosting

提升 php 得到 介紹 iter 其中 agg 分類 amp 如果說線性回歸算法像豐田凱美瑞的話,那麽梯度提升(GB)方法就像是UH-60黑鷹直升機。XGBoost算法作為GB的一個實現是Kaggle機器學習比賽的常勝將軍。不幸的是,很多從業者都只把這個算法當作黑盒使用(

Java 013 StringBuffer類、Arrays類常見排序、包裝類Integer

知識點梳理 心得體會 小知識點 1.執行緒安全與不安全 概念:程式碼所在的程序中有多個執行緒在同時執行,而這些執行緒可能會同時執行這段程式碼。如果每次執行結果和單執行緒執行的結果是一樣的,而且其他的變數的值也和預期的是一樣的,就是執行緒安全的。執行緒安全的程式,多程序需要訪

杭電1047Integer Inquiry

test1 4 123456789012345678901234567890 123456789012345678901234567890 123456789012345678901234567890 0 123456789012345678901234567890 1234

迴圈列印金字塔字母C語言

題目要求:用巢狀迴圈打印出如下金字塔型字母: A ABA ABCBA ABCDCBA ABCDEDCBA (實際格式是金字塔。。) 當時剛學巢狀迴圈時第一次還不是很會做這個金字塔型(汗),實際上看出規律就很好做了,現放程式碼如下: #include<stdio.h> #def

設計模式教程Design Patterns Tutorial筆記之一 建立模式Creational Patterns

目錄 · 概述 · Factory     · What is the Factory Design Pattern?     · 

C++ 泛程式設計單詞數

題目描述 lily的好朋友xiaoou333最近很空,他想了一件沒有什麼意義的事情,就是統計一篇文章裡不同單詞的總數。下面你的任務是幫助xiaoou333解決這個問題。 輸入 有多組資料,每組一行,每組就是一篇小文章。每篇小文章都是由小寫字母和空格組成,沒有標點符號,每

C++ 泛程式設計國名排序

題目描述 問題描述:小李在準備明天的廣交會,明天有來自世界各國的客房跟他們談生意,小李要儘快的整理出名單給經理,你能幫他把客戶來自的國家按英文字典次序排好嗎? 例如小李手上有來自加拿大,美國,中國的名單,排好的名單應是美國,加拿大,中國 。 輸入 第1行為一個n(n&

python解釋語言和編譯語言¥2

解釋型語言和編譯型語言: 1.大家有計算機基礎的都知道,總聽老師說計算機很笨的,就只認識0和1, 所以就需要對我們寫出的程式碼程式進行處理成01程式碼,才能讓計算機認識,進行我們想要的處理,得出我們想得到的結果,或者說是目的! ^其實和我們做事的目的是一樣的,都是想用他為我們做事情,你的做的

RDIFramework.NET V2.7 Web版本升手風琴+樹目錄2級+方法

RDIFramework.NET V2.7 Web版本升手風琴+樹型目錄(2級+)方法   手風琴風格在Web應用非常的普遍,越來越多的Web應用都是採用這種方式來體現各個功能模組,傳統的手風琴風格只支援兩級模組,當我們的功能模組多於兩級時,我們一般採用樹來構造功能選單(我們的框架也提供了這種方式),但

算術轉化和提升的奧祕

首先請大家先思考一下3個問題,問題相互之間是有關聯的。 1,整型字面值是屬於整型家族9種中的哪一種呢? 2,什麼是算術轉換?如何轉換的? 3,什麼是整型提升?如何提升的?為什麼會有整形提升? 下面解答上述問題。 1,整型字面值是屬於整型家族9種中的哪一種呢? 答案取決於

Leetcode 343. 整數拆分Integer Break

給定一個正整數 n,將其拆分為至少兩個正整數的和,並使這些整數的乘積最大化。 返回你可以獲得的最大乘積。例如,給定 n = 2,返回1(2 = 1 + 1);給定 n = 10,返回36(10 = 3 + 3 + 4)。注意:你可以假設 n 不小於2且不大於58。做題之前是選

Mina中關於多個同類Filter如ProtocolCodecFilter例項共存問題的解決

    最近在研讀Mina框架的原始碼,剛好手頭上有專案就直接用上了。直接進入正題……     對Mina有點了解的人都知道,Mina中有一條FilterChain,我們可以向其中加入Filter實現鏈式處理。從原始碼看來,多數Filter(如ProtocolCodecFi

2016屆藍橋杯牌種類dfs演算法

牌型種數 小明被劫持到X賭城,被迫與其他3人玩牌。 一副撲克牌(去掉大小王牌,共52張),均勻發給4個人,每個人13張。 這時,小明腦

檢查異常Checked Exception與非檢查異常Unchecked Exception

這兩個概念看了忘,碰著了又看,老是傻傻的分不清楚,今天把心得結合從網上搜的資料簡單整理一下,希望幫自己明確區分開這兩個概念,並牢牢的記住 1.檢查型異常(Checked Exception)   個人理解:所謂檢查(Checked)是指編譯器要檢查這類異常,檢查的目的一方面是因為該類異常的發生難以避免

c語言三字母詞(trigraph) && 提升

三字母詞(trigraph) && 整型提升 最近看了c的語言標準,因為很喜歡,但是無奈自己英文是個菜鳥.但是所幸看見了一個致力於c11的網站,上面講到了三字母詞,還要整型提升 三字母詞 編譯階段將特定的幾個三字母詞替換為 一個詞這裡是表格