整数在内存中的存储

本文详细介绍了C语言中的数据类型分类,包括整型(如signedchar、unsignedchar等)、浮点型、构造类型(如数组、结构体、枚举和联合),以及整型的原码、反码和补码表示、大小端字节序存储的概念和示例。还探讨了signed和unsigned类型的取值范围差异。

【编程语言】C

一、数据类型的基本归类

  1. 整型
char // C语言没有明确规定char默认有无符号,故取决于编译器(通常是signed char)
    signed char
    unsigned char

short // ==signed short
    signed short
    unsigned short

int // ==signed int
    signed int
    unsigned int

long // ==signed long
    signed long
    unsigned long

long long // ==signed long long
    signed long long
    unsigned long long

整型的表示范围在头文件limits.h中定义。

  1. 浮点型
float
double
  1. 构造类型
// 数组类型
struct // 结构体类型
enum // 枚举类型
union // 联合类型
  1. 指针类型

  2. 空类型

二、整型存储规则

2.1 原码、反码、补码

整型数据的二进制表现形式有三种:原码、反码、补码。存在计算机中的整数数据都是补码。

三种表示形式都由符号位和数值位两部分构成。符号位是二进制的最高位,为0表示“正数”,为1表示“负数”。

原码就是直接将非负整数部分转换成二进制形式,再根据正负在符号位写0/1。

对于正整数,原反补相同。

如:int类型的10的原反补码都是00000000 00000000 00000000 00001010。

对于负整数,原反补需要进行转换。

2.1.1 转换规则

原码->反码->补码:
按位取反(符号位不变,其他位取反),+1。

补码->原码:
方法1:-1,按位取反;
方法2:按位取反,+1。

如:int类型的-10的原码是10000000 00000000 00000000 00001010(0x 80 00 00 0a),反码是11111111 11111111 11111111 11110101(0x ff ff ff f5),补码是11111111 11111111 11111111 11110110(0x ff ff ff f6)。

-1的补码是全1。

2.2 大小端字节序存储

字节序存储:以字节为单位,讨论存储顺序。(所以char类型不需要讨论存储顺序)

大端字节序存储:数据高位字节的内容存储在低地址处,低位存储在高地址处;

小端字节序存储:数据低位字节的内容存储在低地址处,高位存储在高地址处。

比如int类型的0x12345678,从低地址到高地址,大端是12 34 56 78,小端是78 56 34 12。

在这里插入图片描述

// 验证大小端
#include <stdio.h>

int check_sys()
{
	int a = 1;
	return *(char*)&a; // 小端返回1,大端返回0
}

int main()
{
	int ret = check_sys();
	if (ret)
		printf("小端\n");
	else
		printf("大端\n");
	return 0;
}

在这里插入图片描述

2.3 signed、unsigned

对于signed类型,第一位是符号位,其他位是数值位,0正1负;对于unsigned类型,没有符号位,都是数值位,所以表示范围比较大。

对于signed char:

00000000=0
00000001=1
......
01111111=127
10000000=-128 # 因为无法从补码还原回原码(会影响符号位),所以直接被解析成取值范围中的最小负数
10000001=-127
......
11111110=-2
11111111=-1

在这里插入图片描述

所以signed char范围是[-128, 127],即[−27-2^727, 272^727-1]

对于unsigned char:

00000000=0
00000001=1
......
01111111=127
10000000=128
10000001=129
......
11111110=254
11111111=255

所以unsigned char范围是[0, 255],即[0, 282^828-1]

在这里插入图片描述

short、int…同理。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值