博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【C语言】溢出的处理及大小端模式的判断
阅读量:5265 次
发布时间:2019-06-14

本文共 1615 字,大约阅读时间需要 5 分钟。

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

方法一:

编写如下代码测试:

 

#include 
#include
int main(){char sum;int operator1 = 4874;//4874 = 0000 0000,0000 0000,0001 0011,0000 1010 hexadecimal 00 00 13 0Asum = operator1;//situation 1 sum = 0000 0000; cut the higher bits:13//situation 2 sum = 0000 1010; cut the lower bits:0Aprintf("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 
#include
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/archive/2013/03/30/2990556.html

你可能感兴趣的文章
Suite3.4.7和Keil u3自带fx2.h、fx2regs.h文件的异同
查看>>
打飞机游戏【来源于Crossin的编程教室 http://chuansong.me/account/crossincode 】
查看>>
[LeetCode] Merge Intervals
查看>>
【翻译自mos文章】当点击完 finishbutton后,dbca 或者dbua hang住
查看>>
Linux编程简介——gcc
查看>>
一种高效的序列化方式——MessagePack
查看>>
2019年春季学期第四周作业
查看>>
2019春第十周作业
查看>>
解决ThinkPHP关闭调试模式时报错的问题汇总
查看>>
【APT】SqlServer游标使用
查看>>
关于ExecuteNonQuery()返回值为-1
查看>>
Firefox修復QQ快速登錄
查看>>
PAT——1060. 爱丁顿数
查看>>
分布式技术追踪 2017年第二十期
查看>>
git添加公钥后报错sign_and_send_pubkey: signing failed: agent refused operation的解决办法
查看>>
Linux环境变量永久设置方法(zsh)
查看>>
MVC4.0 利用IActionFilter实现简单的后台操作日志功能
查看>>
脑袋卡在窗子里
查看>>
ruby 中文字符to_json后乱码(unicode)
查看>>
《大道至简》第六章读后感
查看>>