• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > C 语言基础教程(我的C之旅开始了)[五]

C 语言基础教程(我的C之旅开始了)[五]

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了c语言基础教程课程,编程基础教程c语言,c语言基础教程,零基础学c语言教程,java语言基础教程等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

12. 基本数据类型:整型(下)

1. 输出各种整数类型的变量

    输出不同类型的整数,需要使用不用的格式限定符。输出 unsigned int 类型的整数,要用 %u 。输出 long ,要用 %ld;如果要以十六进制或者八进制形式输出,那就用 %lx(或者%lX)或者 %lo。注意:虽然整数常量的后缀使用大写或者小写英文字母都没关系,但是它们格式限定符必须使用小写!如果我们要输出 short 类型的整数,可以在 %d 中间加上前缀 h,也就是%hd;同理,%ho 和 %hx(或者 %hX )分别表示以八进制或十六进制形式输出。前缀 h 和 l 可以和 u 组合,表示输出无符号整数。例如:%lu 表示输出 unsigned long 类型的整数;%hu 表示输出unsigned short类型的整数。如果您的编译器支持C99,可以使用 %lld 和 %llu 分别表示输出 long long 和 unsigned long long 。下面我们来看一个输出各种类型整数的程序:

        #include <stdio.h>

        int main(void)
        {
            unsigned int un = 3000000000; /* 我使用的编译器 int 是 32 位的 */
            short end = 200;              /* 而 short 是 16 位的      */
            long big = 65537;

            printf("un = %u and not %d\n", un, un);
            printf("end = %hd and %d\n", end, end);
            printf("big = %ld and not %hd\n", big, big);

            printf("Press ENTER to quit...");
            getchar();
            return 0;
        }

使用 Dev-C++ 编译运行这个程序输出结果如下:

        un = 3000000000 and not -1294967296
        end = 200 and 200
        big = 65537 and not 1
        Press ENTER to quit...

     这个程序表明,错误使用格式限定符会导致意想不到的输出。首先,错误使用 %d 来做无符号整型变量 un 的格式限定符,导致输出的是负数。这是因为我的计算机使用相同的二进制形式来表示 3000000000 和 -129496296 ,而计算机只认识二进制。所以,如果我们使用 %u 告诉 printf 输出无符号整数,输出的就是 3000000000;如果我们误用了 %d,那么输出的就是一个负数。不过,如果我们把代码中的 3000000000 改成 96 的话,输出就不会出现异常。因为 96 没有超出 int 的表示范围。
    然后,对于第二个 printf,无论我们使用 %hd 还是 %d,输出的结果都是一样的。这是因为 C 语言标准规定,当 short 类型值传递给函数时,要自动转化成 int 类型值。之所以转化成 int,是因为 int 被设计为计算机处理效率最高的整数类型。所以,对于 short 和 int 大小不同的计算机来说,把变量 end 转化成 int 类型再传递给函数,速度更快。如此说来,h 好像没有存在意义。其实不然。我们可以用 %hd 来看看较大的整数类型被截断成 short 类型的时候会是什么样的。
    而第三个printf,由于误用%hd,导致输出是1。这是因为,如果long是32位的话,65537的二进制形式便是 0000 0000 0000 0001 0000 0000 0000 0001,而 %hd 命令 printf 输出 short 类型的值,从而导致 printf 只对后 16 位进行处理,最终导致输出 1。
    在前面的教程里,我们说过,保证格式限定符的数目和参数数目一致是我们的责任。同样,保证格式限定符的类型和参数类型一致也是我们的责任!正如上面所说的那样,错误使用格式限定符会导致意想不到的输出!


2. 整数溢出

    首先请看以下程序:

            #include <stdio.h>

            int main(void)
            {
                /* 32 位 int 表示范围的上限和下限 */
                int i = 2147483647, j = -2147483648;
                unsigned int k = 4294967295, l = 0;

                printf("%d %d %d %d\n", i, i+1, j, j-1);
                printf("%u %u %u %u %u\n", k, k+1, k+2, l, l-1);

                printf("Press ENTER to quit...");
                getchar();
                return 0;
            }

使用 Dev-C++ 编译运行这个程序输出结果如下:

            2147483647 -2147483648 -2147483648 2147483647
            4294967295 0 1 0 4294967295
            Press ENTER to quit...

     这个程序中,i+1 是负数,j-1 是正数,k+1 是 0,l-1 是 4294967295 。这是因为加减运算过后,它们的值超出了它们对应的那种整数类型的表示范围,我们把这种现象称为溢出。
    unsigned int 型变量的值如果超过了上限,就会返回 0,然后从 0 开始增大。如果小于 0,那么就会到达 unsigned 型的上限,然后从上限开始减小。就好像一个人绕着跑道跑步一样,绕了一圈,又返回出发点。int 型变量溢出的话,会变成负数,或者正数。
    对于 unsigned 类型的整数,它们溢出时的情况一定和上面描述的一样,这是标准规定的。但是标准并没有规定有符号整数溢出时会出现什么情况。这里描述的有符号整数溢出时出现的情况是最常见的,但是在别的计算机,使用别的编译器,也可能出现不同的情况。

13. 标识符命名规则
 

1. 长度限制

    C89 规定,编译器至少应该能够处理 31 个字符(包括 31)以内的内部标识符(internal identifier);而对于外部标识符(external identifier),编译器至少

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • C 语言基础教程(我的C之旅开始了)[十]
  • C 语言基础教程(我的C之旅开始了)[九]
  • C 语言基础教程(我的C之旅开始了)[八]
  • C 语言基础教程(我的C之旅开始了)[七]
  • C 语言基础教程(我的C之旅开始了)[六]
  • C 语言基础教程(我的C之旅开始了)[五]
  • C 语言基础教程(我的C之旅开始了)[四]
  • C 语言基础教程(我的C之旅开始了)[三]
  • C 语言基础教程(我的C之旅开始了)[二]

相关文章

  • 2017-05-28C语言字符串快速压缩算法代码
  • 2017-05-28基于c语言中调试工具的用法汇总(不包含gdb)
  • 2017-05-28C++编程中的数据类型和常量学习教程
  • 2017-05-28浅谈C++虚重载操作符 virtual operator= 的使用方法
  • 2017-05-28C++ const修饰变量和修饰函数介绍
  • 2017-09-13C++内存分配的方式
  • 2017-05-28Linux下用Valgrind做检查(防止内存泄露)
  • 2017-05-28函数外初始化与函数内初始化详细解析
  • 2017-05-28深入全排列算法及其实现方法
  • 2017-05-28C++设计模式之外观模式

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C语言 设计模式之访问者模式
    • 浅谈stringstream 的.str()正确用法和清空操作
    • C++插入排序算法实例
    • C语言中正切的相关函数总结
    • 详解C语言中strpbrk()函数的用法
    • C语言 以数据块的形式读写文件详解及实现代码
    • C语言格式化输入输出函数详解
    • 简单实现C++复数计算器
    • C语言实现基于最大堆和最小堆的堆排序算法示例
    • C++实现大数乘法算法代码

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有