读《C程序设计语言》笔记4

练习2-1:

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

  采用打印标准头文件中的相应值: 

1 #include < stdio.h >
2 #include < limits.h >
3 // determine ranges of types
4 int main()
5 {
6 printf( " 采用打印标准头文件limits.h中的相应值:\n " );
7 // signed types
8 printf( " signed char min = %d\n " , SCHAR_MIN);
9 printf( " signed char max = %d\n " , SCHAR_MAX);
10 printf( " signed short min = %d\n " , SHRT_MIN);
11 printf( " signed short max = %d\n " , SHRT_MAX);
12 printf( " signed int min = %d\n " , INT_MIN);
13 printf( " signed int max = %d\n " , INT_MAX);
14 printf( " signed long min = %ld\n " , LONG_MIN);
15 printf( " signed long max = %ld\n " , LONG_MAX);
16 // unsigned types
17 printf( " unsigned char max = %u\n " , UCHAR_MAX);
18 printf( " unsigned short max = %u\n " , USHRT_MAX);
19 printf( " unsigned int max = %u\n " , UINT_MAX);
20 printf( " unsigned long max = %lu\n " , ULONG_MAX);
21 system( " pause " );
22 return 0 ;
23 }

  执行结果:

  这种实现方式没有什么需要讨论的,只需要知道相应的头文件和变量名称。

直接计算:

  

1 #include < stdio.h >
2 // determine ranges of types
3 int main()
4 {
5 printf( " 采用直接计算的方式:\n " );
6 // signed types
7 printf( " signed char min = %d\n " , - ( char )((unsigned char ) ~ 0 >> 1 ) - 1 );
8 printf( " signed char max = %d\n " , ( char )((unsigned char ) ~ 0 >> 1 ));
9 printf( " signed short min = %d\n " , - ( short )((unsigned short ) ~ 0 >> 1 ) - 1 );
10 printf( " signed short max = %d\n " , ( short )((unsigned short ) ~ 0 >> 1 ));
11 printf( " signed int min = %d\n " , - ( int )((unsigned int ) ~ 0 >> 1 ) - 1 );
12 printf( " signed int max = %d\n " , ( int )((unsigned int ) ~ 0 >> 1 ));
13 printf( " signed long min = %ld\n " , - ( long )((unsigned long ) ~ 0 >> 1 ) - 1 );
14 printf( " signed long max = %ld\n " , ( long )((unsigned long ) ~ 0 >> 1 ));
15 // unsigned types
16 printf( " unsigned char max = %u\n " , (unsigned char ) ~ 0 );
17 printf( " unsigned short max = %u\n " , (unsigned short ) ~ 0 );
18 printf( " unsigned int max = %u\n " , (unsigned int ) ~ 0 );
19 printf( " unsigned long max = %lu\n " , (unsigned long ) ~ 0 );
20 system( " pause " );
21 return 0 ;
22 }

 执行结果:

  

小结:

  利用按位运算符进行计算。表达式:(char)((unsigned char)~0>>1)

  先把数字0的各个二进制位全部转换为1:取反,~0

  然后,将结果值转换为unsigned char类型:(unsigned char)~0

  再把这个unsigned char类型值右移一位以清除符号位:(unsigned char)~0 >> 1

  最后,把它转换为char类型:(char)((unsigned char)~0>>1)

  这一系列操作的最终结果就得到了signed类型字符的最大值。

  而其signed类型字符的最小值加负号后还需减去1才是最小值。

转载于:https://www.cnblogs.com/wangzhiyu811/archive/2011/07/12/2104377.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值