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