C語言二進制、八進制、十六進制整數書寫和輸出

整數是我們生活中常用的數據類型,也是編程中常用的一種數據,C語言用int關鍵字來定義整數變量(int 是 integer 的簡寫)。

在定義變量的時候,可以加signed、unsigned、short和long四種修飾符。

signed:有符號的,可以表示正數和負數。

unsigned:無符號的,只能表示正數,例如數組的下標、人的身高等。

short:短的,現在主流的64位操作系統下,整數佔用內存4個字節,使用 4
個字節保存較小的整數綽綽有餘,會空閒出兩個字節來,這些字節就白白浪費掉了。在C語言被髮明的早期,或者在單片機和嵌入式系統中,內存都是非常稀缺的資源,所有的程序都在儘可能節省內存。

long:長的,更長的整數。

一、二進制、八進制、十六進制整數的書寫

一個數字默認就是十進制的,表示一個十進制數字不需要任何特殊的格式。但是,表示一個二進制、八進制或者十六進制數字就不一樣了,爲了和十進制數字區分開來,必須採用某種特殊的寫法,具體來說,就是在數字前面加上特定的字符,也就是加前綴。

1、二進制

二進制由 0 和 1 兩個數字組成,使用時必須以0b或0B(不區分大小寫)開頭。

以下是合法的二進制:

  int a = 0b101;      // 換算成十進制爲 5
  int b = -0b110010;  // 換算成十進制爲 -50
  int c = 0B100001;   // 換算成十進制爲 33

以下是非法的二進制:

  int m = 101010;  // 無前綴 0B,相當於十進制
  int n = 0B410;    // 4不是有效的二進制數字

請注意,標準的C語言並不支持上面的二進制寫法,只是有些編譯器自己進行了擴展,才支持二進制數字。換句話說,並不是所有的編譯器都支持二進制數字,只有一部分編譯器支持,並且跟編譯器的版本有關係。

2、八進制

八進制由 0~7 八個數字組成,使用時必須以0開頭(注意是數字 0,不是字母 o)。

以下是合法的八進制數:

  int a = 015;      // 換算成十進制爲 13
  int b = -0101;    // 換算成十進制爲 -65
  int c = 0177777;  // 換算成十進制爲 65535

以下是非法的八進制:

  int m = 256;  // 無前綴 0,相當於十進制
  int n = 03A2;  // A不是有效的八進制數字

3、十六進制

十六進制由數字 0~9、字母 A~F 或a~f(不區分大小寫)組成,使用時必須以0x或0X(不區分大小寫)開頭。

以下是合法的十六進制:

  int a = 0X2A;   // 換算成十進制爲 42
  int b = -0XA0;  // 換算成十進制爲 -160
  int c = 0xffff;   // 換算成十進制爲 65535

以下是非法的十六進制:

  int m = 5A;    // 沒有前綴 0X,是一個無效數字
  int n = 0X3H;  // H不是有效的十六進制數字

4、需要注意的坑

在現實生活和工作中,我們在寫十進制數的時候,爲了對齊或其它原因,在數值前面加0是無關緊要的,但是,在C語言中,不要在十進制數前加0,會被計算機誤認爲是八進制數。

二、二進制、八進制、十六進制整數的輸出

下表是各種進制整數的輸出格式。
在這裏插入圖片描述

細心的讀者可能會發現,上表中沒有二進制的輸出格式,雖然部分編譯器支持二進制數字的書寫,但是卻不能使用printf函數輸出二進制數。您可以編寫函數把其它進制數字轉換成二進制數字,並保存在字符串中,然後在printf 函數中使用%s輸出。

示例:

/*
 *  程序名:book.c,此程序用於演示二進制、八進制、十六進制整數的輸出。
 *  作者:C語言技術網(www.freecplus.net) 日期:20190525。
*/
#include <stdio.h>

int main()
{
  int ii=100;  // 定義變量ii,賦值十進制的100。

  printf("十進制輸出結果:%d\n",ii);  // 十進制輸出結果:100

  printf("八進制、無前綴輸出結果:%o\n",ii);  // 八進制、無前綴輸出結果:144
  printf("八進制、有前綴輸出結果:%#o\n",ii); // 八進制、有前綴輸出結果:0144

  printf("十六進制、無前綴輸出結果:%x\n",ii);  // 十六進制、無前綴輸出結果:64
  printf("十六進制、有前綴(小寫)輸出結果:%#x\n",ii); // 十六進制、有前綴(小寫)輸出結果:0x64

  printf("十六進制、無前綴輸出結果:%X\n",ii);  // 十六進制、無前綴輸出結果:64
  printf("十六進制、有前綴(大寫)輸出結果:%#X\n",ii); // 十六進制、有前綴(大寫)輸出結果:0X64
}

四、版權聲明

C語言技術網原創文章,轉載請說明文章的來源、作者和原文的鏈接。

來源:C語言技術網(www.freecplus.net

作者:碼農有道

如果這篇文章對您有幫助,請點贊支持,或在您的博客中轉發此文,讓更多的人可以看到它,謝謝!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章