二進位制安全_C語言中資料型別

洪七公發表於2019-06-05

1、C語言中的資料型別:

 

 

2、學習資料型別的三個要素:

 

1、儲存資料的寬度

2、儲存資料的格式

3、作用範圍(作用域)

 

3、整數型別:char short int long


char 8BIT 1位元組

short 16BIT 2位元組

int 32BIT 4位元組

long 32BIT 4位元組

 

#include "stdafx.h"
void Plus(){
    char A =0xFF;
    short B = 0xFF;
    int C = 0xFF;
    //在一個大括號裡變數不能重複
}

int main(int argc, char* argv[])
{
    Plus();
    return 0;
}

 

 void Plus(){
00401020   push        ebp
00401021   mov         ebp,esp
00401023   sub         esp,4Ch
00401026   push        ebx
00401027   push        esi
00401028   push        edi
00401029   lea         edi,[ebp-4Ch]
0040102C   mov         ecx,13h
00401031   mov         eax,0CCCCCCCCh
00401036   rep stos    dword ptr [edi]
7:        char A =0xFF;
00401038   mov         byte ptr [ebp-4],0FFh    //區域性變數
8:        short B = 0xFF;
0040103C   mov         word ptr [ebp-8],offset Plus+20h (00401040)
9:        int C = 0xFF;
00401042   mov         dword ptr [ebp-0Ch],0FFh
10:       //在一個大括號裡變數不能重複
11:   }
00401049   pop         edi
0040104A   pop         esi
0040104B   pop         ebx
0040104C   mov         esp,ebp
0040104E   pop         ebp
0040104F   ret

 

 有符號和無符號:在記憶體中儲存是完全一樣的,在使用的時候,要告訴計算機是當什麼用。型別轉換--比較大小和數學運算

#include "stdafx.h"

void Plus(){
    char i =0xff;
    unsigned char a=0xff;    //無符號和無符號 存的是一樣   
}

int main(int argc, char* argv[])
{
    Plus();
    return 0;
}

 

 

 

 4、浮點型別:float double

7:        float i =12.5;
00401038   mov         dword ptr [ebp-4],41480000h   

 

float和double在儲存方式上都是遵從IEEE的規範的

 

 

將一個float型轉化為記憶體儲存格式的步驟為:

1、先將這個實數的絕對值化為二進位制格式

2、將這個二進位制格式實數的小數點左移或右移n位,直到小數點移動到第一個有效數字的右邊。

3、從小數點右邊第一位開始數出二十三位數字放入第22到第0位。

4、如果實數是正的,則在第31位放入“0”,否則放入“1”。

5、如果n 是左移得到的,說明指數是正的,第30位放入“1”。如果n是右移得到的或n=0,則第30位放入“0”。

6、如果n是左移得到的,則將n減去1後化為二進位制,並在左邊加“0”補足七位,放入第29到第23位。
如果n是右移得到的或n=0,則將n化為二進位制後在左邊加“0”補足七位,再各位求反,再放入第29到第23位。

 

 

 

 

7: float i =0.25F;
00401038 mov dword ptr [ebp-4],3E800000h

 

-2-1=-3 ,FF -1   FE -2  FD -3 

FD = 1111 1101

 0011 1110 1000 0000 0000 0000 0000 0000

3E8000

 

5、英文字元儲存

ASCII:

1、ASCII 碼使用指定的 7 位或 8 位二進位制陣列合來表示 128 或 256 種可能的字元。

2、標準 ASCII 碼使用 7 位二進位制數來表示所有的大寫和小寫字母,數字 0 到 9、標點符號,以及在美式英語中使用的特殊控制字元。

3、擴充套件 ASCII 碼允許將每個字元的第 8 位用於確定附加的 128 個特殊符號字元、外來語字母和圖形符號。

 

標準ASCLL碼錶擷取:

二進位制       十進位制 十六進位制     字元                      
0100 0001    65        41            A                      
0100 0010    66        42            B                      
0100 0011    67        43            C                      
0100 0100    68        44            D                      
0100 0101    69        45            E                      
0100 0110    70        46            F                     
0100 0111    71        47            G                      
0100 1000    72        48            H                      
0100 1001    73        49            I                      
0100 1010    74        4A            J                      
0100 1011    75        4B            K                      
0100 1100    76        4C            L                      
0100 1101    77        4D            M                      
0100 1110    78        4E            N                      
0100 1111    79        4F            O                      
0101 0000    80        50            P                      
0101 0001    81        51            Q                      
0101 0010    82        52            R                      
0101 0011    83        53            S                      
0101 0100    84        54            T                      
0101 0101    85        55            U                      
0101 0110    86        56            V                      
0101 0111    87        57            W                      
0101 1000    88        58            X                      
0101 1001    89        59            Y                      
0101 1010    90        5A            Z         

6、中文字元儲存

計算機發明之處及後面很長一段時間,只用應用於美國及西方一些已開發國家,ASCII能夠很好滿足使用者的需求。
但是當天朝也有了計算機之後,為了顯示中文,必須設計一套編碼規則用於將漢字轉換為計算機可以接受的數字系統的數。

天朝專家把那些127號之後的奇異符號們(即EASCII)取消掉,規定:一個小於127的字元的意義與原來相同,
但兩個大於127的字元連在一起時,就表示一個漢字,前面的一個位元組(他稱之為高位元組)從0xA1用到 0xF7,後面一個位元組
(低位元組)從0xA1到0xFE,這樣我們就可以組合出大約7000多個簡體漢字了。

在這些編碼裡,還把數學符號、羅馬希臘的 字母、日文的假名們都編進去了,連在ASCII裡本來就有的數字、標點、字母都
統統重新編了兩個位元組長的編碼,這就是常說的"全形"字元,而原來在127號以下的那些就叫"半形"字元了。

上述編碼規則就是GB2312或GB2312-80

 

相關文章