0
点赞
收藏
分享

微信扫一扫

整型数据的存储,大小端,整型的类型转换

洲行 2022-08-16 阅读 102

整型在内存中的存储和运算

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]

各种整型的取值范围

整型数据的存储,大小端,整型的类型转换_补码_02

在此需要知道有符号整型和无符号整型的取值范围是不一样的。

​unsigned char​​取值范围是0—255,

​signed char​​取值范围是-128—127,

而​​char​​是有符号还是无符号是c语言标准未定义的,由编译器决定。在vs的环境下​​char 等价于 signed char​

现举例说明一个类型的取值范围是怎样得到的:

整型数据的存储,大小端,整型的类型转换_补码_03

例题

#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

举报

相关推荐

0 条评论