新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 高效的C編程之: 變量類型

        高效的C編程之: 變量類型

        作者: 時(shí)間:2013-09-30 來(lái)源:網(wǎng)絡(luò) 收藏

        本文引用地址:http://www.104case.com/article/257017.htm

        14.8

        C支持基本的數(shù)據(jù)類型:char、short、int、longlong、float和double。表14.2說(shuō)明了對(duì)C語(yǔ)言所使用的數(shù)據(jù)類型的映射。

        表14.2 C數(shù)據(jù)類型映射

        C數(shù)據(jù)類型

        表示的意義

        char

        無(wú)符號(hào)8位字節(jié)數(shù)據(jù)

        short

        有符號(hào)16位半字?jǐn)?shù)據(jù)

        int

        有符號(hào)32位字?jǐn)?shù)據(jù)

        long

        有符號(hào)32位字?jǐn)?shù)據(jù)

        longlong

        有符號(hào)64位雙字?jǐn)?shù)據(jù)

        指令集中,無(wú)論是數(shù)據(jù)處理指令還是數(shù)據(jù)加載/存儲(chǔ)指令,處理的數(shù)據(jù)類型不同,指令的執(zhí)行效率是不一樣的。本章將詳細(xì)討論,如何在程序中為變量分配合理的數(shù)據(jù)類型,來(lái)提高代碼的執(zhí)行效率。

        14.8.1局部變量

        屬于RISC的體系結(jié)構(gòu),所有大多數(shù)的數(shù)據(jù)處理都是在32位的寄存器中進(jìn)行的。基于這個(gè)原因,局部變量應(yīng)盡可能使用32位數(shù)據(jù)類型int或long。

        注意

        一些情況下不得不使用char或short類型,例如要使用char或short類型的數(shù)據(jù)溢出指令時(shí)歸零特性時(shí),如模運(yùn)算255+1=0,就要使用char類型。

        為了說(shuō)明局部的影響,先來(lái)看一個(gè)簡(jiǎn)單的例子。

        charcharinc(chara)

        {

        returna+1;

        }

        編譯出的結(jié)果如下。

        charinc

        ADDa1,a1,#1

        ANDa1,a1,#ff

        MOVpc,lr

        再把上面的程序段中變量a聲明位int型,代碼如下。

        intwordinc(inta)

        {

        returna+1;

        }

        比較一下輸出結(jié)果。

        wordinc

        ADDa1,a1,#1

        MOVpc,lr

        分析上面的兩段代碼不難發(fā)現(xiàn),當(dāng)把變量聲明為char型時(shí),編譯器增加了額外的ADD指令來(lái)保證其范圍在0~255之間。

        14.8.2有符號(hào)數(shù)和無(wú)符號(hào)數(shù)

        上一節(jié)討論了對(duì)于局部變量和函數(shù)參數(shù),使用int型比使用char或short型要好。本節(jié)將對(duì)程序中的有符號(hào)整數(shù)(signedint)和無(wú)符號(hào)整數(shù)(unsignedint)的執(zhí)行效率進(jìn)行分析比較。

        首先來(lái)看上一節(jié)的例子,如果將變量指定為有符號(hào)的半字類型(編譯器默認(rèn)short型為有符號(hào)類型),程序的源代碼如下。

        shortshortinc(shorta)

        {

        returna+1;

        }

        編譯后的結(jié)果如下。

        shortinc

        ADDa1,a1,#1

        MOVa1,a1,LSL#16

        MOVa1,a1,ASR#16

        MOVpc,lr

        分析發(fā)現(xiàn),該結(jié)果比使用int型的變量多增加了兩條指令(LSL和ASR)。編譯器先將變量左移16位,然后右移16位,以實(shí)現(xiàn)一個(gè)16位符號(hào)擴(kuò)展。右移是符號(hào)位擴(kuò)展移位,它復(fù)制了符號(hào)位來(lái)填充高16位。

        通常情況下,如果程序中只有加法、減法和乘法,那么有符號(hào)和無(wú)符號(hào)數(shù)的執(zhí)行效率相差不大。但是,如果有了除法,情況就不一樣了。詳細(xì)內(nèi)容可參加除法運(yùn)算優(yōu)化一節(jié)。

        c語(yǔ)言相關(guān)文章:c語(yǔ)言教程



        上一頁(yè) 1 2 3 下一頁(yè)

        關(guān)鍵詞: C編程 變量類型 armcc ARM 編譯器

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 鹤庆县| 安福县| 新竹市| 于田县| 阿拉善左旗| 西安市| 桐城市| 琼结县| 山东| 石狮市| 忻州市| 洛阳市| 剑川县| 邢台市| 镇沅| 台安县| 汉寿县| 建瓯市| 上蔡县| 汕尾市| 荆门市| 东至县| 运城市| 新闻| SHOW| 黎川县| 临西县| 荔波县| 大悟县| 肇东市| 永年县| 高州市| 土默特右旗| 固阳县| 廉江市| 民丰县| 南开区| 遂昌县| 高雄县| 丰县| 保康县|