【C语言】溢出的处理及大小端模式的判断
2013-03-30 21:23
232 查看
我们都知道,字符char类型,占用的空间为8位,int类型占用空间为16位,当int赋值给char的时候会发生什么效果呢?处理规则是什么样的呢?
方法一:
编写如下代码测试:
[html] view
plaincopy
#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;
下面编译运行结果为:
[html] view
plaincopy
[root@localhost program]# vi addoverflowDemo.c
[root@localhost program]# gcc -g addoverflowDemo.c -o addoverflowDemo
[root@localhost program]# ./addoverflowDemo
sum = a
GCC下输出为a,说明源程序是保留了低位字节,舍弃了高位字节。
方法二:
另外,通过判断此机器的cpu的大小端模式,也可以判断它的输入,具体方法如下:
举例如下,判断机器的大小端模式:
判断代码:
[html] view
plaincopy
#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,那么就说明高位字节存放在了低地址端,此时是大端模式:参考下图:
以上代码输出结果为:
[html] view
plaincopy
[root@localhost program]# gcc -g checkendianDemo.c -o checkendianDemo
[root@localhost program]# ./checkendianDemo
little endian: 1
以上两种方法可互相判断。
方法一:
编写如下代码测试:
[html] view
plaincopy
#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;
下面编译运行结果为:
[html] view
plaincopy
[root@localhost program]# vi addoverflowDemo.c
[root@localhost program]# gcc -g addoverflowDemo.c -o addoverflowDemo
[root@localhost program]# ./addoverflowDemo
sum = a
GCC下输出为a,说明源程序是保留了低位字节,舍弃了高位字节。
方法二:
另外,通过判断此机器的cpu的大小端模式,也可以判断它的输入,具体方法如下:
举例如下,判断机器的大小端模式:
判断代码:
[html] view
plaincopy
#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 |
[html] view
plaincopy
[root@localhost program]# gcc -g checkendianDemo.c -o checkendianDemo
[root@localhost program]# ./checkendianDemo
little endian: 1
以上两种方法可互相判断。
相关文章推荐
- 【C语言】溢出的处理及大小端模式的判断
- 【C语言】溢出的处理及大小端模式的判断
- C语言中无符号数运算判断溢出
- 判断C语言中int 与 unsigned 乘法是否会溢出
- Bailian3659 判断是否为C语言的合法标识符【文本处理】
- c语言判断体重是否标准的一些问题处理
- Bailian3659 判断是否为C语言的合法标识符【文本处理】
- leetcode 7. Reverse Integer(C语言,翻转一个整数,判断是否溢出)19
- C语言判断大小端模式
- C语言判断机器CPU大小端模式的两种方法
- 处理数组时,很多情况要注意判断数组的长度是否大于0,否则很容易因索引溢出而导致程序崩溃
- 溢出判断(C语言)
- c语言判断两数相加是否溢出
- C语言溢出判断
- C语言判断大小端模式
- 判断两个int类型的整数相加,相减是否溢出的C语言代码
- 用C语言实现对冗余层发送的数据包进行过滤判断处理
- 【C语言】编写函数判断当前的机器大小端模式
- 【C语言】回文数与回文字符串的判断。
- C语言简单处理报文中固定格式、固定分隔符的字符串