精华内容
下载资源
问答
  • 不看怎么存,只看怎么读 e.g. int a = 010; //8以8进制存 int b = 8;//8以10进制存 printf("%d %d\n",a,b); 以十进制取 a和b打印是8 printf("%o %o\n",a,b); 以8进制取 a和b打印是10 char 在C语言中仍然是整形...

     

     

     


    不看怎么存,只看怎么读

    e.g. int a = 010; //8以8进制存
    int b = 8;//8以10进制存
    printf("%d %d\n",a,b); 以十进制取 a和b打印的是8
    printf("%o %o\n",a,b); 以8进制取 a和b打印的是10

    char 在C语言中仍然是整形占1字节。

    'A'是4字节, char _a = 'A'
    如何把4字节赋值给1字节呢? 要截断。高位存不下,舍弃。
    0000 0000 0000 0000 0001 0000 0100 0001 'A'
    截断,从底位开始存,高位存不下就舍弃。
    0100 0001


    char a=1;
    short b=a; 把char存到short里面,发生位扩展。
    0000 0001
    位扩展
    0000 0000 0000 0001
    正数补0,负数补1

    char a=-1
    short b=a;
    1111 1111 (-1的补码)
    1111 1111 1111 1111

    c语言里面变量之间的运算
    1、短字节向长字节看齐
    2、有符号向无符号看齐。
    3、整型向浮点看齐。
    4、单精度向双精度看齐。

     

    转载于:https://www.cnblogs.com/longhs/p/4214346.html

    展开全文
  • 上次貌似有写一篇指针,详细介绍,那个比较很详细,这一次简略说下,以及运用到编程里面,对这篇文章亲们,希望能有所帮助吧一、指针概述1、指针 内存中每一个字节的编号即是地址,指针就是变量地址2、...

    上次貌似有写一篇指针的,详细介绍,那个比较很详细的,这一次简略的说下,以及运用到编程里面,对看这篇文章的亲们,希望能有所帮助吧

    一、指针概述

    1、指针 内存中每一个字节的编号即是地址,指针就是变量的地址

    2、指针变量 用来存放变量地址的变量

    3、运算符 *:取指针指向内容 &:取变量地址

    4、声明方式 [存储类型] 数据类型 指针名

    88678096_1

    二、指针变量

    1、先赋值,后使用

    2、零指针:int*p=0;(int*p=NULL)附:避免指针变量的非法使用 作为状态比较

    3、viod*类型指针:使用前必须强制转换

    88678096_2

    三、指针与一维数组

    1、数组名:取首地址的地址常量

    88678096_3

    2、指针运算

    ①赋值运算

    88678096_4

    ②算术运算

    88678096_5

    ③关系运算

    88678096_6

    '运算的总结'

    ①指针变量与其指向的变量具有相同的数据类型

    ②指针赋值运算指针的类型要一致

    ③指针算术运算一般是作用域一段连续的内存

    三、指针描述一维数组 可以加下群466572167(群里有伙伴一起交流学习,也有资料可以下载学习)

    1、下标法

    2、指针法

    88678096_7

    88678096_8

    88678096_9

    四、指针描述二维数组

    1、行指针

    2、列指针

    88678096_10

    88678096_11

    88678096_12

    88678096_13

    五、指针与字符串

    1、字符数组

    88678096_14

    2、字符指针

    88678096_15

    3、指针变量与字符数组

    88678096_16

    六、指针与函数

    1、函数指针

    88678096_17

    2、函数参数

    88678096_18

    88678096_19

    七、指针数组

    定义形式:[存储类型]数据类型*数组名[数组长度说明] 。指针数组元素的作用相当于二维数组的行名。 指针数组中元素是指针变量,二维数组的行名是地址常量

    88678096_20

    八、多级指针

    1、一级指针

    88678096_21

    2、二级指针

    88678096_22

    88678096_23

    88678096_24

    小编就暂时先把C语言的指针一些知识点说到这了,可以加下群466572167,可以一起探讨交流提升学习,希望对各位才接触C语言的伙伴们有所帮助吧,纯属个人的想法,要是有不足的方面,有大神的话,欢迎多多补充哈。

    展开全文
  • C语言sizeof用法

    千次阅读 2018-01-24 19:16:15
    C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也... sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,sizeof操作符以字节形式给出了

    C语言中的sizeof是一个很有意思的关键字,经常有人用不对,搞不清不是什么。我以前也有用错的时候,现在写一写,也算是提醒一下自己吧。反正现在来看,还在搞sizeof是什么意思,怎么用正确,还是有点搞笑,都经常用的东西,没有理解透彻,就差的太远了。

    第一  sizeof是什么

      sizeof是C语言的一种单目操作符,如C语言的其他操作符++、--等,sizeof操作符以字节形式给出了其操作数的存储大小。操作数可以是一个表达式或括在括号内的类型名。这个操作数不好理解对吧?后面慢慢看就明白了。sizeof的返回值是size_t,在64位机器下,被定义为long unsigned int。

    第二 sizeof如何使用

    1、用于数据类型

      使用形式: sizeof(type)。其中type如int 、double等。 例如sizeof(int)、sizeof(char*)、sizeof(double)。这个时候sizeof后面的类型必须用括号()包起来,不包起来是错误的,通过不了编译。其中sizeof(void*)在64位下是8,而sizeof(void)是1。其实,在C语言中sizeof(函数),如sizeof(main),结果也是1。但是在C++中,sizeof(void)和sizeof(函数)都是非法的,通过不了编译,后面C++就不说了,现在讲C嘛。其实sizeof(函数),sizeof(void)虽然是1,但是是不正确的使用方式。

    2、用于变量 

      使用形式: sizeof(var)或sizeof var。当操作基本数据类型的时候,在我64位电脑的结果如下

    sizeof(char) 1  
    sizeof(char) 1  
    sizeof(short) 2  
    sizeof(int) 4  
    sizeof(long) 8  
    sizeof(float) 4  
    sizeof(double) 8  
    sizeof(long double) 16  
    sizeof(int*) 8  
    sizeof('a') 4  
    sizeof(1) 4  
    sizeof(1.0f) 4  
    sizeof(1.0) 8  
    sizeof "abc" 4  
    其中sizeof('a') 4有点奇怪哈。

    当操作数是联合类型时,sizeof是其最大字节成员的字节数。当操作数是结构类型时,sizeof是其成员类型的总字节数,包括补充字节在内。如下:

    union  U  
    {  
         char c;  
         double d;  
    }U;  
      
    sizeof(U) = max(sizeof(c),sizeof(d)) = sizeof(1,8) = 8;  
    而sizeof结构体的时候,还要考虑对齐的问题:
    struct S  
    {  
         char c;  
         double d;  
    }s;  
    在我的电脑上,sizeof(s)的大小是16。


    基本上说的比较清楚了,但有些时候和函数参数相关的时候,还是要注意,比如

    int calc(char a[10])  
    {  
        printf("%d\n",sizeof(a));  
        return 0;  
    }  
      
    int main()  
    {  
        char a[10]={"hello"};  
        calc(a);  
        return 0;  
    }  
    打印的结果是8,而不是10,这个是要注意的。




    展开全文
  • c语言的算术运算溢出问题

    千次阅读 2020-03-31 16:02:21
    1、关于计算溢出,看书上说的c语言中有符号数计算溢出话会不知道发生什么(溢出结果未定义),编译器怎么处理。我在keil上试了下,溢出会把溢出部分砍掉,比如定义是short型,结果保留2个字节。 short aa=-...

    1、 关于溢出的结论:可能出现的情况是结果的数据类型定义的小了,导致结果不正确。

    关于计算溢出,看书上说的c语言中有符号数计算溢出的话会不知道发生什么(溢出结果未定义),看编译器怎么处理。我在keil上试了下,溢出会把溢出部分砍掉,比如定义的是short型的,结果保留2个字节。

    short aa=-32767;

    short bb=32;

    short cc;

    cc= aa- bb;

    cc=7fe1;

    如果扩展到jint,结果是ffff7fe1.

    检查是否溢出加 if(aa < 0 && aa -(-32768) >=bb)

    参考:https://blog.csdn.net/weiqifa0/article/details/24320437?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

    这篇文章中说的整数转型溢出感觉比较常见还容易忽略,谨记。主要是负数的时候。

    示例二:整形转型时的溢出

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    int copy_something(char *buf, int len)

    {

        #define MAX_LEN 256

        charmybuf[MAX_LEN];</pre>

    <pre>     ... ...

         ... ...

     

         if(len > MAX_LEN){// <---- [1]

             return-1;

         }

     

         returnmemcpy(mybuf, buf, len);

    }

    上面这个例子中,还是[1]处的if语句,看上去没有会问题,但是len是个signed int,而memcpy则需一个size_t的len,也就是一个unsigned 类型。于是,len会被提升为unsigned,此时,如果我们给len传一个负数,会通过了if的检查,但在memcpy里会被提升为一个正数,于是我们的mybuf就是overflow了。这个会导致mybuf缓冲区后面的数据被重写。

    uint8_t合并成uint16_t时   在keil上试的不加uint16_t也可以。

    uint16_t LEBufToUint16(uint8_t *_pBuf)
    {
        return (((uint16_t)_pBuf[1] << 8) | _pBuf[0]);
    }

    再试:

    short  a = INT16_MAX;

    shor b = 32;

    int cc = a + b;

    结果正确。再试:

    int a = INT32_MAX;

    int b = 32;

    uint32_t  c = a+ b;

    c=0x8000001f

    并没有像链接中文章说的a+b的结果按int存会溢出.可能是编译器处理了,虽然在c语言上结果是未知的。

    "我们来看一段代码:

    1

    2

    3

    4

    5

    void foo(int m, int n)

    {

        size_ts = m + n;

        .......

    }

    上面这段代码有两个风险:1)有符号转无符号2)整型溢出。这两个情况在前面的那些示例中你都应该看到了。所以,你千万不要把任何检查的代码写在 s = m + n 这条语名后面,不然就太晚了。undefined行为就会出现了——用句纯正的英文表达就是——“Dragon is here”——你什么也控制不住了。(注意:有些初学者也许会以为size_t是无符号的,而根据优先级 m 和 n 会被提升到unsigned int。其实不是这样的,m 和 n 还是signed int,m + n 的结果也是signed int,然后再把这个结果转成unsigned int 赋值给s)"

    3、用“UL”避免Keil C51大整数常量运算溢出错误

    Keil C51是与ANSI C兼容的编译器,ANSI C规范规定十进制整数常量的默认数据类型是int、long int和unsigned long int的其中一种,对给定的常量是其中的哪一种要看这个常量的实际大小,如果常数在-32768~32767之间则按int类型处理,如果按int类型处理会溢出就考虑long int或更大的数据类型unsigned long int。总之,编译器总是按尽可能的原则指定常量的类型。
    但这一原则并不总能奏效,当两个常量做运算时就可能导致溢出。如:
    #define SYSCLK                        22118400    // SYSCLK in Hz (22.1184 MHz external crystal oscillator)
    #define SLIDER_REST_TIME    100              // in ms,slider rest time
    #define REST_DELAY               SYSCLK * SLIDER_REST_TIME / (65536 * 1000)
    unsigned char i;
    i = REST_DELAY;
    在keil c51中运行i为0xE1,即225,并不是期望的结果22118400 * 100 / (65536 * 1000) = 33.75,取整为33。原因分析如下:
    宏替换后为:i = 22118400 * 100 / (65536 * 1000);,编译器首先为22118400定义类型,因为22118400不在int的表示范围内,而在long int的范围-2147483648~2147483647内,所以22118400按long int类型处理,在做乘积运算时100被自动按long int处理,22118400 * 100将按两带符号长整型常量进行运算,运算结果仍为带符号长整型,结果写成十六进制是0x83D60000,其十进制是-2083127296,显然出现了溢出错误。keil编译器并没有给出任何错误或警告提示信息(VC++6.0还给出警告warning C4307: '*' : integral constant overflow),继续进行下一个运算65536 * 1000,结果为带符号长整型,十六进制为0x3E80000,十进制为65536000,最后按两长整型除法计算-2083127296 / 65536000,结果为0xFFFFFFE1,由于i为字符类型,取0xFFFFFFE1的最低有效字节为0xE1赋值给i,i的最终值为0xE1。
    解决这种溢出错误的方法用C语言的一个术语就是“提升”(promotion),拿上例来说就是将22118400指定为无符号长整型,即:
    #define SYSCLK                        22118400UL
    注:虽然只要将22118400、100、65536和1000四个常数中的一个指定为无符号长整型即可得到正确的结果,但考虑到可读性及规范性,应选择大整数指定其类型。
    小结:按C51编译器的默认类型整数常量运算可能出现溢出错误,对大整数应指定其数据类型以避免出现可能的运算错误。

    转自:幽幽灵猫

    http://www.cnblogs.com/civet/archive/2011/05/31/2064959.html

    展开全文
  • 你必须知道495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    2.15 如何确定域在结构中的字节偏移量? 2.16 怎样在运行时用名字访问结构中的域? 2.17 C语言中有和Pascal的with等价的语句吗? 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 2.19 程序...
  •  本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并...
  • && r>=0 && r) //IP地址每个字节的范围限制 { printf(temp,"%r.%r.%r.%r",o,p,q,r); if(strcmp(temp,str)==0) { printf("IP地址合法\n"); } else { printf("IP地址不合法\n"); } } else { printf("IP...
  • 《你必须知道495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    《你必须知道的495个C语言问题》以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预...
  • 计算机大小端问题由来已久,具体历史大家可以看看维基百科里边是怎么简述,还是挺不错哦!~~ 这里讲讲计算机里大小端模式: 端模式 首字节 中间字节字节 大端 ...
  • 2.15 如何确定域在结构中的字节偏移量? 28 2.16 怎样在运行时用名字访问结构中的域? 29 2.17 C语言中有和Pascal的with等价的语句吗? 29 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 29...
  • 2.15 如何确定域在结构中的字节偏移量?  2.16 怎样在运行时用名字访问结构中的域?  2.17 C语言中有和Pascal的with等价的语句吗?  2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样?  2.19 ...
  •  2.15 如何确定域在结构中的字节偏移量? 2.16 怎样在运行时用名字访问结构中的域? 2.17 C语言中有和Pascal的with等价的语句吗? 2.18 既然数组名可以用作数组的基地址,为什么对结构不能这样? 2.19 ...
  • 拿到题目以后解读数据就费了好长时间,数据中名称全是英文,了好半天才明白是怎么一回事想到定义数组发现定不了那么大,从网上学了malloc可是完全不知道引入文件后怎么将其导入数组内,试着将网上程序拼接结果...
  • 存储变量内存,是由...先来看看指针变量声明。  我们在声明一个指针变量时候,会根据它将要指向变量类型,声明对应类型,例如: int a; long b; char c; int *pa = &a; long *pb = &b...
  • c语言大小端转化

    万次阅读 2012-12-13 11:47:37
     今天碰一个关于字节顺序问题,虽然起来很简单,但一直都没怎么完全明白这个东西,索性就找了下资料,把它弄清楚.  因为现行计算机都是以八位一个字节为存储单位,那么一个16位整数,也就是C语言short,在...
  • 你必须知道495个C语言问题(PDF)

    热门讨论 2009-09-15 10:25:47
    2.12 如何确定域在结构中的字节偏移? . . . . . . . . . . . . . . . . . 9 2.13 怎样在运行时用名字访问结构中的域? . . . . . . . . . . . . . . . 10 2.14 程序运行正确, 但退出时却“core dump”了,怎么回事...
  • ‘x’是字符常量,占1字节,"x"是字符串常量,相当于’x’+’\0’,占2字节,这都没问题,但怎么理解类似 ‘abcd’ 这种常量:即用单引号括起来多个字符?以下是我对这个问题思考过程: 1、先代码: char c1...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...
  • 数据在内存中到底是怎么存储呢?相信完这篇文章你内功又会增加一点。 本文重点: 1. 数据类型详细介绍 2. 整形在内存中存储:原码、反码、补码 3. 大小端字节序介绍及判断 4. 浮点型在内存中存储...
  •  本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...
  • 本书以问答的形式组织内容,讨论了学习或使用C语言的过程中经常遇到的一些问题。书中列出了C用户经常问的400多个经典问题,涵盖了初始化、数组、指针、字符串、内存分配、库函数、C预处理器等各个方面的主题,并分别...

空空如也

空空如也

1 2 3 4
收藏数 80
精华内容 32
关键字:

c语言的字节怎么看

c语言 订阅