天天看點

linuxC程式設計從入門到精通——變量與資料類型

常量:不會變化的資料。不能被修改。

1. “hello”、'A'、-10、3.1415926(浮點常量)  

2. #define PI 3.1415  【強調】:沒有分号結束标記。 【推薦】 定義宏: 定義文法: #define 宏名 宏值

3. const int a = 10;  定義文法:const 類型名 變量名 = 變量值。

  const關鍵字: 被該關鍵字修飾的變量,表示為隻讀變量。      

變量:會變化的資料。能被修改。

定義文法:類型名 變量名 = 變量值。(一般方法)

變量三要素:類型名、變量名、變量值。  int r = 3;  float s = PI*r*r;(變量值是一個表達式)

變量的定義:  int a = 40;

變量的聲明:  1) int a;  沒有變量值的變量定義 叫做聲明。

    2)extern int a; 添加了關鍵字 extern。

1. 變量定義會開辟記憶體空間。變量聲明不會開辟記憶體空間。

2. 變量要想使用必須有定義。

  當編譯器編譯程式時,在變量使用之前,必須要看到變量定義。如果沒有看到變量定義,編譯器會自動找尋一個變量聲明提升成為定義。

  如果該變量的聲明前有 extern 關鍵字,無法提升。


【建議】:定義變量時。盡量不要重名。      

辨別符:

變量和常量的統稱。

命名規則: 1. 通常常量使用大寫、變量使用小寫。大小寫嚴格區分。

    2. 隻能使用字母、數組、下劃線(_)命名辨別符。且,數字不能開頭。 a-z/A-Z/0-9/_

      int a5ir = 10; ok

      int _34F = 6; ok

      float s2_i85c = 5.4;  ok

      int 98ti_54 = 4;  error.

    3. 禁止使用關鍵字和系統函數作為辨別符名稱。  main/system/printf/sleep....      

sizeof關鍵字:

不是函數。用來求一個變量、類型的大小。 傳回一個 無符号整數。 使用 %u 接收傳回值。

方法1: sizeof(類型名)  -- sizeof(int)

方法2: sizeof(變量名)    --- int a = 20; sizeof(a)

【了解】: sizeof 變量名/類型名    舉例1: sizeof int

          舉例2: sizeof a      

有符号整型:

signed: 有符号 (超級不常用, 通常省略):    int a = 10; a = -7; 

int類型:  %d    4 位元組      

  int 名 = 值;

short類型:  %hd   2 位元組

  short 名 = 值;    short s1 = 3;

long類型: %ld   4 位元組    (windows: 32/64: 4位元組; Linux:32位:4位元組, 64位:8位元組) 

  long 名 = 值;   long len = 6;

long long 類型:%lld   8 位元組

  long long 名= 值; long long llen = 70;      

無符号整型:

unsigned: 無符号     隻表示資料量,而沒有方向(沒有正負)  

unsigned int類型: %u    4 位元組

  unsigned int 名 = 值; 
  
  unsigned int a = 40;    

unsigned short類型: %hu   2 位元組

  unsigned short 名 = 值;   

  unsigned short s1 = 3;

unsigned long類型:  %lu   4 位元組 (windows: 32/64: 4位元組; Linux:32位:4位元組, 64位:8位元組)

  unsigned long 名 = 值;    

  unsigned long len = 6;

unsigned long long 類型:%llu    8 位元組

  unsigned long long 名 = 值; 

  unsigned long long llen = 70;      

char字元類型:1位元組

存儲一個字元。本質是ASCII碼。 ‘A’、‘a’、‘%’、‘#’、‘0’

格式比對符: %c

‘A’:65

‘a’:97

‘0’:48

‘\n’:10

‘\0’: 0      

轉義字元:

‘\’ 将普通字元轉為 特殊意。 将特殊字元轉為本身意。

'\n' 和 ‘\0’      

實型(浮點數、小數):

float:  單精度浮點型。   4位元組

  float v1 = 4.345;

  %f格式比對符。 預設保留 6 位小數。

double:雙精度浮點型。    8位元組   【預設】

  double v2 = 5.678;

unsigned float v1 = 4.345;  無符号的 float 資料

unsigned double v2 = 5.678; 無符号的 float 資料

printf("n = %08.3f\n", n);

  輸出的含義為:顯示8位數(包含小數點), 不足8位用0填充。并且保留3位小數。對第4位做四舍五入。      

進制和轉換:

十進制轉2進制。  --- 除2反向取餘法。 【重點】

十進制轉8進制。  --- 除8反向取餘法。

十進制轉16進制。--- 除16反向取餘法。

  int a = 56; -- 111000

  int b = 173;    -- 10101101

2進制轉10進制。

  2^10 = 1024

  2^9 = 512

  2^8 = 256

  2^7 = 128

  2^6 = 64

  2^5 = 32

  2^4 = 16

  2^3 = 8

  2^2 = 4      

8進制:

8進制轉10進制。 

  定義8進制數文法: 

    056: 零開頭,每位數0~7之間。  ---- 46

    0124:         ---- 84

8進制轉2進制。

  按421碼将每個八進制位展開。

    056:5--》 101。 6--》 110  。

      101110

    05326:5 --》 101。 3--》 011。 2--》 010。 6--》 110

2進制轉8進制:

  1 010 111 010 110:  012726

  自右向左,每3位一組,按421碼轉換。高位不足三位補0      

16進制:

文法: 以0x開頭,每位 取 0-9/A-F/a-f

    A -- 10

    B -- 11

    C -- 12

    D -- 13

    E -- 14

    F -- 15
16 -- 10:

  0x1A:  16+10 = 26

  0x13F:15+3x16+256 

16 -- 2:

  0x1A: 00011010

  0x13F:  000100111111

2 -- 16:

  0001 0011 1111:   13F

  自右向左,每4位一組,按8421碼轉換。高位不足三位補0      

總結:

int m = 0x15F4;

int n = 345;

int var = 010011; // 不允許。 不能給變量直接複制 二進制資料。

輸出格式:

  %d %u %o %x %hd %hu %ld %lu %lld %llu %c %f %lf

  %d %u %x %c %s      

存儲知識:

1 bit位  就是一個 二進制位

一個位元組 1B = 8bit位。 

1KB = 1024B
  
1MB = 1024KB

1GB = 1024MB

1TB = 1024GB      

源碼反碼補碼:【了解】

源碼:
  43 ->  00101011
  -43 --> 10101011

反碼:   
  43 ->  00101011
  -43 --> 10101011
    11010100

補碼:(現今計算機采用的存儲形式)

  43 ->  00101011  : 正數不變
  -43 --> 11010101 : 負數,最高位表符号位, 其餘取反+1      

43-27 ==> 43 + -27

人為規定: 10000000 --> -128      
char 類型:1位元組 8個bit位。 數值位有7個。   

  有符号: -2^7 --- 2^7-1  == -2^(8-1) -- 2(8-1) -1  

    --> -128 ~ 127

  無符号: 0 ~ 2^8 -1 

    -> 0~255

  不要超出該資料類型的存儲範圍。


short類型:2位元組  16bit

  有符号: -2^15 --- 2^15-1  == -2^(16-1) -- 2(16-1) -1  

    --> -32768 ~ 32767

  無符号: 0 ~ 2^8 -1 

    --> 0~65535    


int 類型:4位元組      -2^(32-1) -- 2^(32-1)-1

  有符号:

    -> -2147483648 ~ 2147483647  

  無符号:    0~2^32 -1 

    --> 0~4294967295

long類型:4位元組

  有符号:

    --> -2147483648 ~ 2147483647 

  無符号:    0~2^32 -1 

    --> 0~4294967295 

longlong 類型:8位元組


  有符号:
    --> -2^(63) ~ 2^(63)-1 

  無符号:    

    --> 0~2^63-1      
#include <stdio.h>

#define N 1024    
#define EXIT_SUCCESS 0
int main(void)
{
  int a = 10;   
  
  printf("這是一個常量 N:%d\n", N);
  
  printf("這是一個變量 a:%d\n", a);
  

  return EXIT_SUCCESS;
}      
linuxC程式設計從入門到精通——變量與資料類型
#include <stdio.h>

#define PI 3.1415     

int main(void)
{
  const int r = 3;        // 定義一個隻讀變量 
  
  //圓的面積 = PI x 半徑的平方
  float s = PI * r * r;
  
  //圓的周長 = 2 x PI x 半徑  
  float l = 2 * PI * r;

  printf("圓的周長為:%f\n", l);  // 預設顯示 6 位小數。
  printf("圓的面積為:%f\n", s);  
  
  printf("圓的周長還可以寫成:%.2f\n", PI * r * r);
  printf("圓的面積還可以寫成:%.2f\n", 2 * PI * r); // 指定保留小數點後保留2位,對第3位進行4舍五入

  return 0;
}      
linuxC程式設計從入門到精通——變量與資料類型
#include <stdio.h>    

int main(void)
{
  int var = 54;     // 定義一個變量 var, 定義的同時指定初值為 54
  
  var = 238;      // 使用變量,給變量var賦新值 238

  printf("var = %d\n", var);  //  使用變量,列印變量var的值到螢幕。

  return 0;
}      
linuxC程式設計從入門到精通——變量與資料類型
#include <stdio.h>
#define EXIT_SUCCESS 0
int main(void)
{
  int a = 10;     // 定義有符号整數 a, 給a賦初值為 10
  short b = 20;   // 定義有符号整數 b, 給a賦初值為 20
  long c = 30L;   // 定義有符号整數 c, 給a賦初值為 30, 可以簡寫為 long c = 30;
  long long d = 40LL; // 定義有符号整數 d, 給a賦初值為 40, 可以簡寫為 long long d = 40;

  printf("sizeof(a)= %d\n", sizeof(a));
  printf("sizeof(b)= %d\n", sizeof(b));
  printf("sizeof(c)= %d\n", sizeof(c));
  printf("sizeof(d)= %d\n", sizeof(d));

  printf("按類型, int 大小為:%d\n", sizeof(int));
  printf("按類型, short 大小為:%d\n", sizeof(short));
  printf("按類型, long 大小為:%d\n", sizeof(long));
  printf("按類型, long long 大小為:%d\n", sizeof(long long));

  // system("pause");

  return EXIT_SUCCESS;
}      
linuxC程式設計從入門到精通——變量與資料類型
#include <stdio.h>

int main(void)
{
  char ch = 'a';
  printf("sizeof(ch) = %u\n", sizeof(ch));
  
  printf("%c\n", 97);   //字元'a'
  printf("%c\n", 65);   //字元'A'

  char A = 'A';   // 定義字元變量 A, 初值為 ‘A’
  char a = 'a';   // 定義字元變量 a, 初值為 ‘a’
  
  printf("a = %d\n", a);    //字元'a'的ASCII的值97
  printf("A = %d\n", A);    //字元'A'的ASCII的值65

  printf("A = %c\n", 'a' - 32); //小寫a轉大寫A
  printf("a = %c\n", 'A' + 32); //大寫A轉小寫a
  
  ch = ' ';
  printf("空格ASCII的值:%d\n", ch);       //空格ASCII的值 32
  printf("\'\\n\'ASCII的值:%d\n", '\n');    //換行符ASCII的值 10
  printf("字元\'\\0\':%d\n", '\0');   //字元'\0'的ASCII的值 0
  printf("字元\'0\':%d\n", '0');      //字元'0'的ASCII的值 48
  
  return 0;
}      
#include <stdio.h>

int main(void)
{
  char ch;    // 有符号 char 型資料,取值範圍 -128~127

  //符号位溢出會導緻數的正負發生改變
  ch = 0x7f + 2;  //因為:0x7f == 0111 1111 == 127,是以 等價于 ch = 127 + 2; 
  printf("%d\n", ch); 
  //     0111 1111
  //+2後 1000 0001,這是負數補碼,其原碼為 1111 1111,結果為-127

  //最高位的溢出會導緻最高位丢失
  unsigned char ch2;
  ch2 = 0xff+1;   //因為:0xff == 255 == 1111 1111,是以 等價于 ch2 = 255 + 1; 
  printf("%u\n", ch2);
  //    1111 1111
  //+1後 10000 0000, char隻有8位最高位的溢出,結果為0000 0000,十進制為0

  ch2 = 0xff + 2; //因為:0xff == 255 == 1111 1111,是以 等價于 ch2 = 255 + 2; 
  printf("%u\n", ch2);
  //    1111 1111
  //+1後 10000 0001, char隻有8位最高位的溢出,結果為0000 0001,十進制為1

  return 0;
}      

繼續閱讀