zoukankan      html  css  js  c++  java
  • 《C程序设计语言》 练习2-1

    问题描述

      编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现

      Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.

    解题步骤

      这里我们只讲解第二种也就是计算的方法,第一种很简单,照着表格抄上打印出来就OK了。

      主要思路:unsigned类型就是让二进制的所有位都变成1;

           signed类型就是把除了符号位之外的位数全部变成1,再减一后整体取负数。

      用第二种方法首先我们要了解几个知识点:

        1.二进制补码

        2.按位取反符号~

        3.位移操作>>

      我们先看代码然后解释:

    代码如下

    #include<stdio.h>
    
    int main()
    {
        //unsigned 类型
        printf("unsigned char max:%u
    ",(unsigned char)~0 );
        printf("unsigned int max:%u
    ",(unsigned int)~0 );
        printf("unsigned short max:%u
    ",(unsigned short)~0 );
        printf("unsigned long max:%lu
    ",(unsigned long)~0 );
    
        //signed 类型
        printf("signed char max:%d
    ",(char)((unsigned char)~0>>1));
        printf("signed char min:%d
    ",-(char)((unsigned char)~0>>1)-1);
        printf("signed int max:%d
    ",(int)((unsigned int)~0>>1));
        printf("signed int min:%d
    ",-(int)((unsigned int)~0>>1)-1);
        printf("signed short max:%d
    ",(short)((unsigned short)~0>>1));
        printf("signed short min:%d
    ",-(short)((unsigned short)~0>>1)-1);
        printf("signed long max:%ld
    ",(long)((unsigned long)~0>>1));
        printf("signed long min:%ld
    ",-(long)((unsigned long)~0>>1)-1);
        return 0;
    }

    详细解释

    首先,我们看unsigned类型的一个语句:

    printf("unsigned char max:%u
    ",(unsigned char)~0 );
    

      

    我们要打印出unsigned char的取值的最大值,我们要了解 unsigned char占1个字节,也就是8位二进制。8位二进制的最大值为11111111,即255(2^8-1=256-1)

    用按位取反符号~把0(00000000)转换为11111111,之后再将其强制转换为unsigned char类型就会得到255,即(unsigned char)~0

    再看unsigned int,占据4个字节,就是4个8位二进制,最大值为11111111 11111111 11111111 11111111

    同理,~0后,强制转换类型(unsigned int)~0

    之后,我们看signed类型

    printf("signed char max:%d
    ",(char)((unsigned char)~0>>1));
    

      

    signed类型是有符号位的,我们要让符号位之外的数全部变成1就可以了

    第一,变为最大值:(unsigned char)~0

    第二,右移一位,去除符号位:(unsigned char)~0>>1

    第三,最大值就是第二位的结果,最小值要在第二步的基础上减一再取负号(后面解释为什么)

    为什么最小值还要进一步操作?

    我们知道char类型占据一个字节,就是一个8位二进制,其中左边第一位为符号位,其余7为为数值位

    2^7=128个数,算上0,所以符号位为0时,是0~127,符号位为1时,是 -127~0,这时候会有两个0,就是出现了“-0”

    -128和-0的原码是不一样的;

    但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;

    被截短的-128的原码才和-0的原码相等;

    今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000)

     

    所以我们在算最小值时,要减一出现-128

  • 相关阅读:
    Git将本地代码迁移到其他地方(TFS)
    vs code config
    window10 vs 以管理员打开
    Azure database
    ApplicationInsights.config导致Azure Storage 403
    sql server try catch tran
    vs code shortcut
    从备份文件bak中识别SQL Server的版本
    SQL SERVER导出模型图
    powerdesigner设计的pdm模型导出清晰图片格式
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/12842420.html
Copyright © 2011-2022 走看看