• Unix/Linux环境C编程入门教程(23) 字符数字那些事儿


    1.atoi

    包含头文件:

        #include <stdlib.h>

    函数原型:

        int atoi( const char *str );

    功能:将字符串str转换成一个整数并返回结果。参数str 以数字开头,当函数从str 中读到非数字字符则结束转换。

    参数str字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 ) 字符时停止转换,返回整型数。否则,返回零。

    示例代码:

    i = atoi( "512.035" );

    i 的值为 512.

     2.atol函数

    包含头文件:

        #include <stdlib.h>

    函数原型:

        long atol( const char *str );

    函数功能:将字符串转换成长整型数并返回结果。函数会扫描参数str字符串,跳过前面的空格字符,直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时才结束转换,并将结果返回。

    返回值:返回转换后的长整型数。如果传入的字符串为空,或者字符串包含的内容非阿拉伯数字序列,则函数返回默认值0

    示例代码:

    x = atol( "1024.0001" );

    x的值为1024L.

     3.atof函数

    所需要的头文件:

        #include <stdlib.h>

    函数原型:

    double atof( const char *str );

    函数功能:

    将字符串str转换成一个双精度数值并返回结果。 参数str 必须以有效数字开头,但是允许以"E"或"e"除外的任意非数字字符结尾。

    返回值:

        返回转换后的浮点型数

    示例代码:

    x = atof( "42.0is_the_answer" );

    x的值为42.0.

    通过这个3个函数我们是不是发现了什么呢?

    ato* 型

    如果是i 代表int也就是从ascii码值转化成一个int的值,

    同理 l 代表转换成一个long型的值,

    f代表转换成一个float型的值。

    4.Linux中查找这些函数

    我们进入到Linux桌面

    点击在终端中打开

    在终端中输入 man atoi

    如下显示的是man中关于atoi atol的介绍

    同理我们可以使用man查看atof的介绍 在终端中键入:man atof

    退出man帮助文档的界面

    5.小试牛刀

    下面我们使用这3个函数写几行有意思的代码加深理解。

    #include <stdio.h> //printf scanf
    #include <stdlib.h> //atoi atol atof
    
    int main(void)
    {
        char input[32]="4294967299";
        int   iNum = atoi(input);
        float fNum = atof(input);
        long  lNum = atol(input);
        printf("int = %d
    float = %f
    long = %ld
    ",iNum,fNum,lNum);
        return 0;
    }


    在RHEL7中打开终端 利用vi创建一个main.c或者在windows上传送进虚拟机

    回车进入

    同时按下:键和shift键 进入末行模式 然后输入wq

    保存并退出之后会到终端的界面

    下面开始编译 ./itcast运行可执行文件 结果显示出来了

    慢着 怎么int的值输出3了呢?

    思考一下 我们输入的字符4294967296这个数值是太大了

    6.数据类型与范围

    1. 超过int的范围 所以一旦数值超过了该数据类型所能表示的范围就会发生溢出

    数据模型决定了C语言中基本数据类型与数据宽度的对应关系。我们常用的32位模型称为ILP32,而64位模型有三种:LP64、LLP64和ILP64。在64位模型中,指针一定是64位的,但是int和long的宽度则在不同的数据类型中有不同的定义。

    现在的Windows 32和Linux 32是ILP32;Windows x64 版采用的是LLP64模型,Linux64采用的是LP64模型,用gcc编译时可以指定-m32按照ILP32模型进行编译

    数据类型模型

    LP32

    ILP32

    LLP64

    LP64

    ILP64

    char

    8

    8

    8

    8

    8

    short

    16

    16

    16

    16

    16

    int

    16

    32

    32

    32

    64

    long

    32

    32

    32

    64

    64

    long long

    64

    64

    64

    64

    64

    pointer

    32

    32

    64

    64

    64

    总结:使用一个数据类型的时候我们应该清晰的知道该数据类型的范围能否完全表示这个变量

    7.其他环境中效果怎么样呢?

    在Solaris x64上

    在RHEL6 32bit上

    在MAC x64上

    通过上述实验我们可发现,不同的操作系统可能对于数据类型的采用也是不一样的。

    这对于我们以后要写一个跨多个操作系统的程序提出了警示。

    有兴趣的同学可以去研究一下,对应着本文给出的数据类型和模型的对应图去推测各个操作系统的选用数据类型的版本。

  • 相关阅读:
    宋宝华:slab在内核内存管理和用户态Memcached的双重存在
    能感知功耗的Linux调度器(EAS)
    内存检测王者之剑—valgrind
    随心所动,厂商的CPU核管理策略介绍
    一文读懂 进程怎么绑定 CPU
    Fastbootd实现原理分析
    cachestat、cachetop、pcstat-linux系统缓存命中率分析工具
    WIFI的WPS和pin码(测试失败)
    视频下载(钉钉、B站等) 解决方案
    DevExpress 报表设计文件(.vsrepx)不显示或显示空白
  • 原文地址:https://www.cnblogs.com/new0801/p/6177089.html
Copyright © 2020-2023  润新知