【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,那么就说明高位字节存放在了低地址端,此时是大端模式:参考下图:

内存地址小端模式大端模式
0x80007812
0x80015634
0x80023456
0x80031278

以上代码输出结果为:

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

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值