1. 程式人生 > >c語言數據類型(一)

c語言數據類型(一)

32位 9.png 溢出 ima con string sign unsigned 負數

(強數據類型)

1.常量

  常量是程序中不可變的量

  10為常量

  

  兩種常量

  #define 定義宏常量

  const

  

  #對於#define 類型的常量,c語言的習慣是常量名稱大寫, 對於普通const常量以及變量,一般以小寫結合大寫的方式

#include <stdio.h>

int main() 
{
    printf("%d", 10);
    return 0;
}
#include <stdio.h>

#define MAX 10 //定義一個宏常量 值為10
int main() 
{
    printf("%d", MAX);
    
return 0; }
#include <stdio.h>

#define MAX 10 //定義一個宏常量 值為10
int main() 
{    
    //MAX = 200; //等號左邊必須為變量,不能為常量,常量的值不能修改
    printf("%d", MAX);
    return 0;
}
#include <stdio.h>
int main() 
{    
    const int a = 100;
    printf("%d", a);
    return 0;
}

  

  以上為整數常量

  

  字符串 常量

  

#include <stdio.h>
#define
STRING "hello world\n"; int main() { const char * str = "hello c"; }

2. 二進制 位 字節 字

  一個位只能表示 0 1 兩種狀態 bit 1位位1bit

  一個字節為八個二進制  8位 BYTE 8個bit一個字節

  500GB B為BYTE 10Mb bit 

  1個字 2個字節 簡稱WORD

  2個字為雙字 ZWORD

 

  0 八進制 0x 16進制

  技術分享

技術分享

  原碼 反碼 補碼

  整數占 4個字節 以下只寫了 1個字節舉例子

技術分享

  

技術分享

    技術分享

技術分享

sizeof 關鍵字

  是c語言關鍵字,功能是求指定數據類型所占用的字節數。

#include <stdio.h>
int main() 
{    
    printf("%d\n", sizeof(10));
    return 0;
}

  32位(bit)操作系統返回的為4 最大的存儲的數字 2(32-1) 的數字

  size_t 類型

  

int類型

  int 常量變量

  int 是32位的一個二進制整數,在內存中占據4個字節‘’

   %d , 輸出一個有符號的10進制整數

   %u , 代表輸出一個無符號的10進制的整數

int main() 
{    
    printf("%x\n", 0x10);//輸出10
    printf("%x\n", 10);//輸出十進制10對應得十六位a
    printf("%x\n", 0xa);//輸出a
    return 0;
}

#include <stdio.h>
int main() 
{    
    printf("%x\n", 0x10);//輸出10
    printf("%x\n", 10);//輸出十進制10對應得十六位a
    printf("%x\n", 0xa);//輸出a
    printf("%x", -7);
    return 0;
}
/*
printf("%x", -7);  輸出 fffffff9(這是-7的補碼轉換為16進制)
源碼 10000000 00000000 000000000 00000111
反碼 11111111 11111111 111111111 11111000
補碼 11111111 11111111 111111111 11111001
*/

/*
-7
1000 0111 用有符號的眼光-7 無符號的眼光135
*/

 

%x 代表輸出十六進制數 (十六進制不表達負數)

%X 用大寫字母方式輸出16進制數

%o 輸出八進制數 (2進制與八進制不表達負數)

short、 long 、int 、 long long 、unsigned 、signed(有符號數)

  short 為短整數 在32位操作系統占2個字節

  long 代表長整數, 在32位系統下位4個字節 在64位系統下,windows 4個字節 Unix 為八個字節(不同的操作系統不一樣)

  int (32位系統以上)不論在什麽情況下都是4個字節

  long long 是64位 也就是八個字節的整數 對於32位操作系統cpu寄存器位32位的,計算longlong類型的數據, 效率很低

  unsigned 無符號的數,可以加在任意整數類型後面技術分享

#include <stdio.h>
int main() 
{    
    int a = 10;//4個字節
    short b = 10;
    printf("%d\n", sizeof(b));//2
    return 0;
}
#include <stdio.h>
int main() 
{    
    int a = 10;//4個字節
    short b = 10;
    long long c = 10;
    printf("%d\n", sizeof(c));//8
    return 0;
}
#include <stdio.h>
int main() 
{    
    int a = 10;//4個字節
    short b = 10;
    long long c = 10;
    unsigned int d = 10;
    printf("%d\n", sizeof(d));//4
    return 0;
}

整數溢出

一個整數計算的時候超過整數能夠容納的最大單位後,整數會溢出,溢出的結果是高位舍棄。

當一個小的整數復制給大的整數,符號位不會丟失,會集成

    unsigned short abc = 0xffff;
    abc = abc + 1;
    printf("%d\n", abc);//0
    return 0;
  
#include <stdio.h>
int main() 
{    
    int a = 10;//4個字節
    short b = 10;
    long long c = 10;
    unsigned int d = 10;
    printf("%d\n", sizeof(d));//4

    unsigned short abc = 0xffff;
    //abc = abc + 1;
    //printf("%d\n", abc);//0
    
    abc = abc + 100;
    printf("%d\n", abc);//99

    abc = 2;
    abc = abc - 5;
    printf("%u\n", abc);//65533

    int i1 = 0x12345678;
    abc = i1;
    printf("%x\n", abc);//5678 

    short abc1 = -2;
    //1000 0000 0000 0010
    //1111 1111 1111 1101
    //1111 1111 1111 1110(-2)
    //1111 1111 1111 1111 1111 1111 1111 1110
    
    i1 = abc1;
    printf("%x\n", i1);//fffffffe

    unsigned short abc2 = 0;

    abc2 = abc2 - 1;
    //00000000 00000000
    //10000000 00000001
    //11111111 11111110
    //11111111 11111111(65535)
    printf("%d\n", abc2);//65535
    
    //00000000 00000000 00001100
    //10000000 00000000 00000000 00001010
    //11111111 11111111 11111111 11110110
    return 0;

}

技術分享

內存都是以字節為單位的

1個整數,4個字節

大端對齊 與小端對齊

  對於arm,intel 這種x86 構架的復雜指令CPU ,整數在內存是倒著放的,低地址放高位,高地址放低位, 小端對齊

  但對於uniux服務器的CPU,更多的是采用大端對齊的方式存放整數

  

技術分享

c語言數據類型(一)