有符號數補碼,浮點數,字符編碼


有符號數

   有符號整數中用來表示符號的是最高位,最高位為0表示正數,最高位為1表示負數。在內存中同樣占4個字節,由於最高位為符號位,不能用於表示數值,因些有符號整數的取值范圍要比無符號數取值范圍少1位,

0x80000000~0x7FFFFFFF;

負數在內存中都是以補碼的形式存放。

補碼:

   正數的補碼是其本身

  負數的補碼:先求其相反數的補碼,然后對該補碼的二進制逐位求反,最后加 1。

-10
10二進制:1010
擴展為32位:1000,0000,0000,0000,000,0000,0000,1010 最高位為符號位
補碼: 1111,1111,1111,1111,1111,1111,1111,0101 + 1
=1111,1111,1111,1111,1111,1111,1111,0110
=0xfffffff6
x + x(反碼) + 1 = 0
補碼 =  0 - x = x(反碼) + 1

 

 -69DA H

二進制:   1000,0000,0000,0000,0110,1001,1101,1010 B

按位求反:1111,1111,1111,1111,1001,0110,0010,0101 B

加一:       1111,1111,1111,1111,1001,0110,0010,0110 B 

      f  f  f  f   9,     6,     2,       6    H

 

  6 9 D A

+     ? ? ? ?  (9625H)

--------------------

  F F F F

 

 

浮點數

C++中,使用浮點方式存儲實數,用兩種數據類型來保存浮點數:float(單精度)double(雙精度)Float在內存中占4個字節,double在內存中占8字節空間

 

浮點數的編碼方式

   浮點數編碼轉換采用的是IEEE規定的編碼標准floatdouble這兩類型數據的轉換原理相同。IEEE規定的浮點數編碼會將一個浮點數轉換為二進制數。以科學記數法划法,將浮點數拆分為3部分:符號、指數、尾數

 

float類型的IEEE編碼

   float類型在內存中占4個字節(32位),最高位用於表示符號;在剩下的31位中,從右向左了8位用於表示指數其余用於表示尾數。如圖:

 

 

正指數情況

例:將float類型10.625轉換為IEEE編碼,需要將10.625轉換成對應的二進制數(10.625 * 2^3 = 85 (1010101)):1010.101,

整數部分為1010,小數部分為101;然后對單精度數進行科學記數法轉換:將小數點向左移動,每個移動1次指數加1,移動到除符號位的最高位為1處,停止移動,這里移動3次(移動多少次指數部分就是多少)

10.625進行科學記數法轉換后二進制部分為1.010101,指數部分為3。在IEEE編碼中,由於在二進制情況下最高位始終為1,為一個恆定值,故將其忽略不計。

這里是一個正數,所以符號位為0,指數部分:由於指數部分可能出現負數,十進制數127可表示為二進制數01111111

IEEE編碼方式規定,當指數小於01111111時為一個負數,反之為一個正數。

10.625IEEE轉換后各位的情況如下:

    符號位:0

    指數位:3+127(十進制),轉為二進制 10000010

    尾數位:01010100000000000000000(當不足23位時,低位補0填充)

 

10.625轉換后的IEEE編碼按二進制拼接為:01000001001010100000000000000000

轉換成十六進制數為:0x412A0000,由於內存以小尾方式進行排列,故為:00 00 2a 41

 

負指數

   -0.8125IEEE轉換后各位的情況如下:

    -0.8125的二進制為-0.1101

    符號位:1

    指數位:-1+127(十進制),轉為二進制 01111110(如果不足8位,高位補0)

    尾數位:10100000000000000000000(當不足23位時,低位補0填充)

-0.8125轉換后的IEEE編碼按二進制拼接為:10111111010100000000000000000000

轉換成十六進制數為:0xBF500000,由於內存以小尾方式進行排列,故為:00 00 50 BF

 

 

 

如果小數部分轉換為二進制時得到一個無窮值,則根據尾數長度舍棄多余部分。

 

Double類型的IEEE編碼

  Double類型的和float類型大同小異,只是double類型表示的范圍更大,占用的空間更多,是float類型所占空間的兩倍。

double類型:指數用11位正數表示,加上1023用於指數符號判斷。

 

字符編碼

C++中,字符的編碼格式分兩種:ASCIIUnicode.

  ASCII編碼在內存中占一個字節大小,只能表示26個字母和常用符號。

  Unicode編碼在內存中占兩個字節大小,表示的范圍是0~65535.

Microsoft Visual C++ 6.0中,使用char定義ASCII編碼格式的字符,使用wchar_t定義Unicode編碼格式字符。

 

 

#include <iostream>


void fun(bool flag)
{
    if (flag) {
        printf("hello world\n");
    }
    else {
        printf("sorry.\n");
    }
    //int a = 0, b = 4;
    //int c = b / a;
}

int main()
{
    bool m = false;
    unsigned int a = 10;
    int b = -10;
    float c = 10.625;
    fun(m);
    const char *p = "Hello World!\n";
    const wchar_t* w = L"hello Unicode";
    system("pause");
    return 0;
}

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM