zoukankan      html  css  js  c++  java
  • 指针与强制类型转换

    指针与强制类型转换

    变量的数据类型的含义

    (1)所有的类型的数据存储在内存中,都是按照进制格 式存储的。所以内存中只知道有0和1,不知道 是int的、还是float的还是其他类型。

    (2)int、 char、short等属于整形,他们的在储方式(数转换成进制往内在中放的方式)是租同的,只是内在格子大小不同(所以这几种整型就彼此叫二进制兼容格式),而float和double的存储方式彼此不同,和整型更不同。
     
    (3)inta =  5;时,编译器给a分配4字节空间,并且将5按照int类型的存储方式转成一进制存到a所对应的内存空间中去(a做左值的) ;我们printf去打印a的时候(a此时做右值),printf内部的vsprintf函数会按照格式化字符串(就是printf传参的第个字符 串参数中的%d之类的东西所代表的类型去解析a所对应的内存空间,解析出的值用来输出。也就是说,存进去时是按照这个变量本身的数据类型来存储的(譬如本例中a为int所以按照int格式来存储);但是取出来时是按照printf中%d之类的格式化字符串的格式来提取的。此时虽然a所代表的内存空间中的10101序列并没有变(内存是没被修改的)但是怎么理解(怎么把这些1010转成数字)就不一定了。譬如我们用%d来解析,那么还是按照int格式解析则值自然还是5;但是如果用%f来解析,则printf就以为a对应的内存空间中存储的是一个float类型的数,会按照float类型来解析,值自然是奇怪的一个数字了。 
     

    总结: c语言中的数据类型的本质,就是决定了这个数在内存中怎么存储的问题,也就是决定了这个数如何转成二进制的问题。一定要记住的一点是内存只是存储1010的序列,而不管这些1010怎么解析。所以要求我们平时数据类型不能瞎胡乱搞。

    分析几个题目:

    (1) 按照int类型存却按照float类型取     一定会出错

    (2) 按照int类型存却按照char类型取     有可能出错也有可能不出错大

    (3) 按照short类型存却按照int类型取      有可能出错也有可能不出错

    (4) 按照float类型存却按照double取                一定会出错

    #include <stdio.h>
    
    
    void main()
    {
        int a = 5;
        int* p = &a;
    
        float* p1;
    
        p1 = (float* )p;
    
        printf("p = %f
    ",p); //输出奇怪的数字
        
        printf("p = %d
    ",p);
        printf("p = %x
    ",p);
        printf("p = %p
    ",p);
        
        
        printf("p1 = %d
    ",p1);//输出奇怪的数字
    }

    下面解释下0xffffff88怎么来的

     

     
     
     
     
     
     
     


       
  • 相关阅读:
    几种不同风格的Toast
    [置顶] 如何访问web文件夹之外的文件
    30天自制操作系统笔记(九十)
    tomcat install on Linux
    共享内存使用的基本思路和接口
    30天自制操作系统笔记(九十)——源码
    storm单机版安装配置
    新安装XAMPP,phpMyAdmin错误:#1045
    TI-Davinci开发系列之二使用CCS5.2TI Simulator模拟环境调试DSP程序
    ffmpeg的logo, delogo滤镜参数设置
  • 原文地址:https://www.cnblogs.com/sanshijvshi/p/10290103.html
Copyright © 2011-2022 走看看