美文网首页
C学习征途一

C学习征途一

作者: Eden0503 | 来源:发表于2018-10-15 17:39 被阅读0次

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

显示结果:


image.png

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

显示的结果可以表明:有符号数超过能够表示的范围,将会将该数的二进制的高位截断,截断后的二进制数对应的十进制就是显示在屏幕上的数了。

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;
}
image.png

相关文章

  • C学习征途一

    Q1:数据超过了数据类型能够表示的最大范围怎么办? A:对于unsigned类型,编译器会调整越界值使其满足要求,...

  • C++学习征途一

    Q1:一个实际结果超出unsigned char 的表示范围,编译器会怎么处理呢? A1:编译器会一刀切,比如,下...

  • C++学习征途二

    Q1:C / C++编译的程序占用的内存。 一个由C / C++编译的程序占用的内存分为以下几个部分1、栈区(st...

  • C语言学习征途二——小技巧

    VS2017使用scanf报错的解决方法 Q:VS2017使用scanf报错的解决方法。A:在程序最前面加:#pr...

  • 如果学习是游戏……

    1. 今天玩游戏玩得好累。 不是玩王者荣耀,也不是玩荒野求生,而是玩学习的征途。 学习的征途?什么鬼?有这款游戏?...

  • 征途漫漫,惟有奋斗

    征途漫漫,惟有奋斗 。今天打开学习强国 听取了每日金句中习近平总书记一句经典语录—— 征途漫漫,惟有奋斗 。 人呐...

  • 原创歌词//《征途》

    我踏向征途,挥剑直指前方 学习先祖长征精神 道路有多漫长 梦想就有多坚强 时空变换,征途遥远 我有长征精神作伴 威...

  • 新年话征途

    征途是什么?有人说征途是星辰大海,有人说征途是浩瀚宇宙,有人说征途是凌峰绝顶一览众山小…… 我的征途是什么呢?我似...

  • 《叛逆的征途》摘录

    叛逆的征途——王澍上 开讲啦 的演讲主题。 自王澍开始学习建筑起,他自称自己就一直在叛逆的征途上。 对待建筑 宁波...

  • C语言怎么会有这么变态的例子!速来围观!!!

    在学习C/C++或者想学习C/C++可以加群:775356268,大家一起学习交流 1.下面这个示例是C语言的痛,...

网友评论

      本文标题:C学习征途一

      本文链接:https://www.haomeiwen.com/subject/bksgoftx.html