1. 程式人生 > >C語言入門-資料型別

C語言入門-資料型別

一、C語言的型別

  1. 整數:char、short、int、long、longlong
  2. 浮點型:float、double、long double
  3. 邏輯:bool
  4. 指標
  5. 自定義型別

型別有何不同

  1. 型別名稱:int、long、double
  2. 輸入輸出的格式化:%d、%ld、%lf
  3. 所表達的數的範圍:char<short<int<float<double
  4. 記憶體所佔的大小:1個位元組到16個位元組
  5. 記憶體中的表達形式:二進位制(補碼)、編碼

sizeof

是一個運算子,給出某個型別或變數在記憶體中所佔據的位元組數,

是一個靜態運算子,它的結果在編譯的時候就決定了,不要在sizeof的括號中做運算

  1. sizeof(int)
  2. sizeof(i)
#include <stdio.h>

int main()
{
    int a;
    a = 6;

    printf("sizeof(int)=%ld\n", sizeof(int));
    printf("sizeof(double)=%ld\n", sizeof(double));
    printf("sizeof(a)=%ld\n", sizeof(a));

    return 0;
}

//sizeof(int)=4
//sizeof(double)=8
//sizeof(a)=4

二、整數型別

  1. char:1位元組(8位元)
  2. short:2位元組
  3. int:取決於編譯器(cpu),通常是意義上的1個字
  4. long:取決於編譯器(cpu),通常是意義上的1個字
  5. longlong :8位元組

整數內部表達

計算機內部一切都是二進位制

  1. 18 ------> 00010010
  2. 0 ------> 000000
  3. -18 ------> ?
  4. 負數以原碼的補碼形式表達

反碼:

正數的反碼與原碼相同,負數的反碼為對該數的原碼除符號位外各位取反[每一位取反(除符號位)]。 取反操作指:原為1,得0;原為0,得1。(1變0; 0變1)

補碼:

補碼 = 反碼 + 1

這裡用-1來進行舉例子

  1. 二進位制:00000001 (1)
  2. 反碼:11111110
  3. 補碼:11111111

所以-1在計算機裡用二進位制表達就是全1

總結:

  1. 正數的反碼和補碼都與原碼相同
  2. 負數的反碼為對該數的原碼除符號位外各位取反
  3. 負數的補碼為對該數的原碼除符號位外各位取反,然後在最後一位加1

整數的範圍

  1. 對於一個位元組(8位),可以表示:00000000-11111111
  2. 其中:
    • 00000000 ------> 0
    • 11111111 ~~~ 10000000 ------> -1 ~~ -128
    • 00000001 ~~~ 01111111 ------> 1 ~ 127
  3. char :1位元組:-128~127
  4. short:2位元組:-32768~32767
  5. int:取決於編譯器(cpu),通常的意義是“1個字”
  6. long:4位元組
  7. longlong:8位元組

unsigned

  1. 如果一個常量想要表達自己是unsigned,可以在後面加一個U或者u
  2. 用L或者l表示long
  3. unsigned的初衷並非擴充套件數能表達的範圍,而是為了做純二進位制運算,主要是移位
#include <stdio.h>

int main()
{
    unsigned char c = 255;
    int i = 255;

    printf("c=%d,i=%d\n", c , i);
    // c=-1,i=255

    // 當使用了unsigned之後 c=255,i=255


    return 0;
}

整數越界

整數是以純二進位制方式進行計算的,所以

  1. 11111111 + 1 ------> 100000000 ------> 0
  2. 01111111 + 1 ------> 10000000 ------> -128
  3. 10000000 - 1 ------> 01111111 ------> 127

也就是在計算機中 127 + 1 = -128,-128 -1 = 127

    char a = 127;
    char b = -128;
    char c = a + 1;
    char d = b - 1;
    printf("%d, %d\n", c , d );
    //  -128, 127

如圖所示:順時針為減、逆時針為加

整數的輸入和輸出

只有兩種形式:int或者long long

  1. %d:int
  2. %u:unsigned
  3. %ld:long long
  4. %lu:unsigned long long

8進位制和16進位制

  1. 一個以0開始的數字字面量是8進位制
  2. 一個以0x開始的數字字面量是16進位制
  3. %o用於8進位制,%x用於16進位制
  4. 8進位制和16進位制只是如何把數字表達為字串,與內部如何表達數字無關
    char c = 012;
    int i = 0x12;

    printf("c=%d, i=%d\n", c,i);
    printf("c=0%o, i=0x%x\n", c,i);
    // c=10, i=18
    // c=012, i=0x12

選擇整數型別

沒有特別的需要,就選擇int

三、浮點型別

型別 字長 範圍 有效數字
float 32 7
double 64 15

輸入和輸出

型別 scanf printf
float %f %f、%e
double %lf %f、%e

其中%e是科學計數法

#include <stdio.h>

int main()
{
    double a = 12.321;
    printf("%e\n", a );
    //1.232100e+001
    return 0;
}

輸出精度

在%和f之間加上.n可以指定輸出小數點後幾位,這樣的輸出是做4舍5入的

超出範圍的浮點數

  1. printf輸出inf表示超出範圍的浮點數:+∞、-∞
  2. printf輸出nan表示不存在的浮點數

浮點運算的精度

    float a , b , c ;

    a = 1.345f;
    b = 1.123f;

    if (c == 2.468)
    {
        printf("相等\n");
    }else
    {
        printf("不相等\n");
    }
//不相等

帶小數點的字面量是double而不是float

float需要用f或者F字尾來表明身份

選擇浮點型別

沒有特殊的需要直接用double

字元型別

  1. char是一種整數,也是一種特殊的型別:字元
  2. 用單引號表示的字元字面量:'a' , '1'
  3. printf和scanf裡用%c來輸入輸出字元
    char c;
    c = '1';
    printf("%d\n", c);  // 49  ascll
    printf("%c\n", c);  // 1
    

逃逸字元

用來表達無法打印出來的控制字元或者特殊字元,它是由一個反斜槓  開頭,後面跟上另一個字元 ,然後組成一個字元

printf("請輸入身高和體重,如果輸入\"170 80\"表示170cm和80kg\n");
  1. \b : 回退一格 、\t : 到下一個表格位
  2. \n : 換行 、 \r:回車
  3. " :雙引號 、 ':單引號
  4. \ : 反斜槓本身

自動型別轉換

  1. 當運算的兩邊出現不一致的型別時,就會出現型別的自動轉換,自動轉化為較大的型別
  2. 對於printf,任何小於int的型別會被轉換為int,float會被轉換成double
  3. 但是scanf不會,要輸入short,需要%hd

強制型別轉換

(型別)值

例如:(int)10.2

強制型別轉換的優先順序高於四則運算子

bool

  1. include <stdbool.h>

  2. 然後就可以使用bool和true、false
#include <stdio.h>
#include <stdbool.h>

int main()
{
    bool b = 6 > 5;
    bool t = true;

    printf("%d\n", b);
    // 1
    return 0;
}

四、邏輯運算子

邏輯運算子是對邏輯的運算,結果只有0或者1

運算子 描述 示例 結果
邏輯非 !a
&& 邏輯與 a && b
|| 邏輯或 a||b

優先順序

如圖所示:

短路

邏輯運算子是自左向右進行的,如果左邊的結果已經能決定結果了,就不會做右邊的計算

  1. 對於&&,左邊是false時就不做右邊了
  2. 對於||,左邊是true時就不做右邊了

條件運算子

  1. count = (count > 20) ? count - 10 : count + 10;
  2. 條件、條件滿足時的值、條件不滿足的值

逗號運算

    int i,j;

    i = 3+4,5+6;
    j = (3+4,5+6);
    printf("%d\n", i);
    printf("%d\n", j);
    // 7
    // 11

當有括號時,計算的是第二個表達