• 【C语言】溢出的处理及大小端模式的判断


    我们都知道,字符char类型,占用的空间为8位,int类型占用空间为16位,当int赋值给char的时候会发生什么效果呢?处理规则是什么样的呢?

    方法一:

    编写如下代码测试:

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
    char sum;
    int operator1 = 4874;
    //4874 = 0000 0000,0000 0000,0001 0011,0000 1010 hexadecimal 00 00 13 0A
    sum = operator1;
    //situation 1 sum = 0000 0000; cut the higher bits:13
    //situation 2 sum = 0000 1010; cut the lower bits:0A
    printf("sum = %x\n",sum);
    
    return EXIT_SUCCESS;
    }
    


    如果赋值之后,将保留高位字节,舍弃低位字节,将打印出13H;相反,如果保留低位字节,舍弃低位字节,控制台将会打印出 0A;

    下面编译运行结果为:

    [root@localhost program]# vi addoverflowDemo.c
    [root@localhost program]# gcc -g addoverflowDemo.c -o addoverflowDemo
    [root@localhost program]# ./addoverflowDemo 
    sum = a
    


    GCC下输出为a,说明源程序是保留了低位字节,舍弃了高位字节。

    方法二:

    另外,通过判断此机器的cpu的大小端模式,也可以判断它的输入,具体方法如下:

    举例如下,判断机器的大小端模式:

    判断代码:

    #include <stdio.h>
    #include <stdlib.h>
    
    int checkCPU( );
    int main()
    {
    printf("little endian: %d\n",checkCPU());
    return EXIT_SUCCESS;
    }
    int checkCPU( )
    {
        {
               union w
               {  
                      int  a;
                      char b;
               } c;
               c.a = 0x12345678;
               return(c.b ==0x78);
        }
    } 
    
    


    如下为源代码解释分析:

    union中定义的是变量公用地址空间,所以整形变量 a和字符型的变量 b的起始地址是相同的,即一开始存放的位置是相同的。

    a = 0X12345678

    如果要判断,cpu体系是大端还是小端,就得知道 12作为高位字节是存放在了内存的高地址端还是低地址端,如果高位字节存放在了高地址端,那么  char(a)只占用一个字节,它的值就应该是空间首地址的值:78,此时称为小端模式;

    但是如果char(a)的值是 12,那么就说明高位字节存放在了低地址端,此时是大端模式:参考下图:

    内存地址 小端模式 大端模式
    0x8000 78 12
    0x8001 56 34
    0x8002 34 56
    0x8003 12 78

    以上代码输出结果为:

    [root@localhost program]# gcc -g checkendianDemo.c -o checkendianDemo
    [root@localhost program]# ./checkendianDemo 
    little endian: 1
    


    以上两种方法可互相判断。

  • 相关阅读:
    第一篇随笔
    我的第一篇博客
    第一次博客
    芜湖
    芜湖~
    起飞
    第一天
    第一篇随笔
    第一篇随笔
    随笔
  • 原文地址:https://www.cnblogs.com/xinyuyuanm/p/2990556.html
Copyright © 2020-2023  润新知