C學(xué)習(xí)征途一

Q1:數(shù)據(jù)超過了數(shù)據(jù)類型能夠表示的最大范圍怎么辦?

A:對于unsigned類型,編譯器會調(diào)整越界值使其滿足要求,編譯器會自動將該值對unsigned類型的取值范圍進行求模,然后取所得值;對于signed類型,將一個超過其取值范圍的數(shù)賦值給signed的類型時,也不會報錯,但是最后的取值和二進制編碼有關(guān)系,高位二進制編碼被舍棄。(具體看例子)

#include<stdio.h>
int main(){
    //對于unsigned類型,編譯器會調(diào)整越界值使其滿足要求,編譯器會自動將該值對unsigned類型的取值范圍進行求模,然后取所得值.
    unsigned short int  A1 = 65535;   // unsigned short的最小表示范圍和unsigned int 一樣,都是 0 到 65535(2^16 - 1)
    unsigned short int  A2 = 65535;   // 溢出的話,取得就是 mod 65536  
    printf("sizeof(unsigned short int): %d\n", sizeof(unsigned short int));  // 顯示結(jié)果 sizeof:2 
    printf("A1 = %d\n", A1);
    printf("A2 = %d\n", A2);
    
    unsigned int  AA1 = 4294967295;   // unsigned short的最小表示范圍和unsigned int 一樣,都是 0 到 4294967295(2^32 - 1)
    unsigned int  AA2 = 4294967296;   // 溢出的話,取得就是 mod 65536  
    printf("sizeof(unsigned int): %d\n", sizeof(unsigned int));  // 顯示結(jié)果 sizeof:4 
    printf("AA1 = %d\n", AA1);
    printf("AA2 = %d\n", AA2);

    // 對于signed類型,將一個超過其取值范圍的數(shù)賦值給signed的類型時,也不會報錯
    short int  B1 = 32769;   //short的最小表示范圍和  -(2^15 - 1)到(2^15 - 1)   -32767~32767
    short int  B2 = -32768;   //  
    printf("sizeof(short int): %d\n", sizeof(short int));  // 顯示結(jié)果 sizeof:2,p = -32767
    printf("B1 = %d\n", B1);
    printf("B2 = %d\n", B2);
    return 0;
}

顯示結(jié)果:


image.png

Q2:進一步地,到底對于有符號數(shù)據(jù),某數(shù)據(jù)超過了能夠表示的數(shù)據(jù)范圍該怎樣。

A:一定要對應(yīng)二進制編碼來看。
比如:short int 的表示范圍-(2^15 - 1)到(2^15 - 1),也就是 -32767~32767。
若現(xiàn)在 short int B1=32768 那么表示的是什么呢。程序顯示的是 -32768。
若現(xiàn)在 short int B1=32769 那么表示的是什么呢。程序顯示的是 -32767。
若現(xiàn)在 short int B1=-32768 那么表示的是什么呢。程序顯示的是 -32768。
若現(xiàn)在 short int B1=-32769 那么表示的是什么呢。程序顯示的是 -32767。 So,why?

#include<stdio.h>
int main(){
    short int  B1 = 32767;   //short的最小表示范圍和  -(2^15 - 1)到(2^15 - 1)   -32767~32767
    short int  B2 = -32767;   //  
    short int  B3 = 32768;
    short int  B4 = 32769;
    short int  B5 = -32768;
    short int  B6 = -32769;
    short int  B7 = 123456789;
    short int  B8 = -13035;
    
    printf("32767 顯示的數(shù)字為:%d\n", B1); 
    printf("-32767 顯示的數(shù)字為:%d\n", B2);
    printf("32768  顯示的數(shù)字為: %d\n", B3); 
    printf("32769 顯示的數(shù)字為:%d\n", B4);
    printf("-32768 顯示的數(shù)字為:%d\n", B5); 
    printf("-32769 顯示的數(shù)字為:%d\n", B6);
    printf("123456789 顯示的數(shù)字為 %d\n", B7); 
    printf("-13035 顯示的數(shù)字為 %d\n", B8);
    return 0;
}
image.png
#include<stdio.h>
#include<iostream>
#include<bitset>
using namespace std;
int main() {
    short int  B1 = 32767;   //short的最小表示范圍和  -(2^15 - 1)到(2^15 - 1)   -32767~32767
    short int  B2 = -32767;   //  
    short int  B3 = 32768;
    short int  B4 = 32769;
    short int  B5 = -32768;
    short int  B6 = -32769;
    short int  B7 = 123456789;
    short int  B8 = -13035;

    bitset<sizeof(short int) * 8> bin_B1(B1);
    cout << "32767的二進制表示:" << bin_B1 << endl;
    cout << endl;

    bitset<sizeof(short int) * 8> bin_B2(B2);
    cout << "-32767的二進制表示:" << bin_B2 << endl;
    cout << endl;

    bitset<sizeof(int) * 8> bin_BB3(B3);
    cout << "32768的二進制表示" << bin_BB3 << endl;
    bitset<sizeof(short int) * 8> bin_B3(B3);
    cout << "32768的二進制表示" << bin_B3 << endl;
    cout << endl;


    bitset<sizeof(int) * 8> bin_BB4(B4);
    cout << "32769的二進制表示" << bin_BB4 << endl;
    bitset<sizeof(short int) * 8> bin_B4(B4);
    cout << "32769的二進制表示" << bin_B4 << endl;
    cout << endl;

    bitset<sizeof(int) * 8> bin_BB5(B5);
    cout << "-32768的二進制表示" << bin_BB5 << endl;
    bitset<sizeof(short int) * 8> bin_B5(B5);
    cout << "-32768的二進制表示" << bin_B5 << endl;
    cout << endl;

    bitset<sizeof(int) * 8> bin_BB6(B6);
    cout << "-32769的二進制表示" << bin_BB6 << endl;
    bitset<sizeof(short int) * 8> bin_B6(B6);
    cout << "-32769的二進制表示" << bin_B6 << endl;
    cout << endl;

    bitset<sizeof(int) * 8> bin_BB7(B7);
    cout << "123456789的二進制表示" << bin_BB7 << endl;
    bitset<sizeof(short int) * 8> bin_B7(B7);
    cout << "123456789的二進制表示" << bin_B7 << endl;
    cout << endl;

    bitset<sizeof(short int) * 8> bin_B8(B8);
    cout << "-13035的二進制表示" << bin_B8 << endl;
    cout << endl;
    system("pause");
    return 0;
}
image.png

顯示的結(jié)果可以表明:有符號數(shù)超過能夠表示的范圍,將會將該數(shù)的二進制的高位截斷,截斷后的二進制數(shù)對應(yīng)的十進制就是顯示在屏幕上的數(shù)了。

Q3: sizeof()用法和幾種類型所占的字節(jié)。

A:主要看計算機的操作系統(tǒng),執(zhí)行以下程序就可以啦。

#include<stdio.h>
int main(){
    printf("sizeof(unsigned short int): %d\n", sizeof(unsigned short int));  // 顯示結(jié)果 sizeof:2 
    printf("sizeof(short int): %d\n", sizeof(short int));  // 顯示結(jié)果 sizeof:2 
    printf("sizeof(int): %d\n", sizeof(int));  // 顯示結(jié)果 sizeof:4 
    printf("sizeof(float): %d\n", sizeof(float));  // 顯示結(jié)果 sizeof:4 
    printf("sizeof(double): %d\n", sizeof(double));  // 顯示結(jié)果 sizeof:8 
    printf("sizeof(long long): %d\n", sizeof(long long));  // 顯示結(jié)果 sizeof:8 
    printf("sizeof(long double): %d\n", sizeof(long double));  // 顯示結(jié)果 sizeof:16 
    return 0;
}

Q4:字符大小寫的最高境界;

A4:將 字符 與 32 按位取異或。 ch xor 32. 這樣就不用加減32了。

#include<iostream>
#include<bitset>
using namespace std;
int main() {

    char ch = 'a';
    char ch2 = ch xor 32;  // 最關(guān)鍵的程序
    cout << "a的大小寫變化:"<<ch2 << endl;
    bitset<sizeof(short int) * 8> bin_32(32);
    cout << "32的二進制表示" << bin_32 << endl;
    bitset<sizeof(short int) * 8> bin_ch(ch);
    cout << "A的二進制表示" << bin_ch << endl;
    bitset<sizeof(short int) * 8> bin_ch2(ch2);
    cout << "a的二進制表示" << bin_ch2 << endl;
    cout << endl;
    system("pause");
    return 0;
}
image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容