C学习征途一
2018-10-15 本文已影响0人
Eden0503
Q1:数据超过了数据类型能够表示的最大范围怎么办?
A:对于unsigned类型,编译器会调整越界值使其满足要求,编译器会自动将该值对unsigned类型的取值范围进行求模,然后取所得值;对于signed类型,将一个超过其取值范围的数赋值给signed的类型时,也不会报错,但是最后的取值和二进制编码有关系,高位二进制编码被舍弃。(具体看例子)
#include<stdio.h>
int main(){
//对于unsigned类型,编译器会调整越界值使其满足要求,编译器会自动将该值对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)); // 显示结果 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)); // 显示结果 sizeof:4
printf("AA1 = %d\n", AA1);
printf("AA2 = %d\n", AA2);
// 对于signed类型,将一个超过其取值范围的数赋值给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)); // 显示结果 sizeof:2,p = -32767
printf("B1 = %d\n", B1);
printf("B2 = %d\n", B2);
return 0;
}
显示结果:

Q2:进一步地,到底对于有符号数据,某数据超过了能够表示的数据范围该怎样。
A:一定要对应二进制编码来看。
比如:short int 的表示范围-(2^15 - 1)到(2^15 - 1),也就是 -32767~32767。
若现在 short int B1=32768 那么表示的是什么呢。程序显示的是 -32768。
若现在 short int B1=32769 那么表示的是什么呢。程序显示的是 -32767。
若现在 short int B1=-32768 那么表示的是什么呢。程序显示的是 -32768。
若现在 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 显示的数字为:%d\n", B1);
printf("-32767 显示的数字为:%d\n", B2);
printf("32768 显示的数字为: %d\n", B3);
printf("32769 显示的数字为:%d\n", B4);
printf("-32768 显示的数字为:%d\n", B5);
printf("-32769 显示的数字为:%d\n", B6);
printf("123456789 显示的数字为 %d\n", B7);
printf("-13035 显示的数字为 %d\n", B8);
return 0;
}

#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;
}

显示的结果可以表明:有符号数超过能够表示的范围,将会将该数的二进制的高位截断,截断后的二进制数对应的十进制就是显示在屏幕上的数了。
Q3: sizeof()用法和几种类型所占的字节。
A:主要看计算机的操作系统,执行以下程序就可以啦。
#include<stdio.h>
int main(){
printf("sizeof(unsigned short int): %d\n", sizeof(unsigned short int)); // 显示结果 sizeof:2
printf("sizeof(short int): %d\n", sizeof(short int)); // 显示结果 sizeof:2
printf("sizeof(int): %d\n", sizeof(int)); // 显示结果 sizeof:4
printf("sizeof(float): %d\n", sizeof(float)); // 显示结果 sizeof:4
printf("sizeof(double): %d\n", sizeof(double)); // 显示结果 sizeof:8
printf("sizeof(long long): %d\n", sizeof(long long)); // 显示结果 sizeof:8
printf("sizeof(long double): %d\n", sizeof(long double)); // 显示结果 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; // 最关键的程序
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;
}
