整型在内存中的存储和运算
32位vs环境
存储方式和顺序
对于整型来说,数据存放在内存中其实存放的是补码,顺序由机器的大小端决定
存储方式
原码反码补码是什么,有什么用
计算机中的整数有三种2进制表示方法,即原码、反码和补码。 三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。正数的原、反、补码都相同。负整数的三种表示方法各不相同。
原码反码补码的转换规则
原码 直接将数值按照正负数的形式翻译成二进制就可以得到原码。 反码 将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码 反码+1就得到补码
顺序
什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中; 小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地 址中。
为什么要有大小端的顺序
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有比8bit大的数据,那么内存中一个地址单元对应一个字节,大于一个字节的数据该以怎样的顺序存放在内存中呢?以16进制数字0x11223344为例:
运算
整型的分类
//整型家族
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]
各种整型的取值范围
在此需要知道有符号整型和无符号整型的取值范围是不一样的。
unsigned char
取值范围是0—255,
signed char
取值范围是-128—127,
而char
是有符号还是无符号是c语言标准未定义的,由编译器决定。在vs的环境下char 等价于 signed char
现举例说明一个类型的取值范围是怎样得到的:
例题
#include <stdio.h>
//vs环境下
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
a和b都属于signed char类型,要把-1存入a和b中,-1的二进制位就需要截断,截断后反码都为 11111111 ,
将其存入a和b中。要按有符号整型类型(%d)打印,那么就要整型提升
(可以看c语言专栏里的另外一篇博客[整型提升](https://blog.csdn.net/Aen_hen/article/details/126374244)),
最后结果仍然是-1.
而c是unsigned char类型,截断后的反码为11111111,要按有符号整型打印,于是整型提升,
得到的补码转换为原码为00000000000000000000000011111111