原码、反码、补码及整数在内存的存储方式

目录

数据类型

signed 和 unsigned 详细解释

例子:

整型家族

浮点数家族

构造类型(详情可见我已更新blog)

指针类型(详情可见我已更新blog)

空类型

原码、反码、补码

正整数的原码、反码、补码相同!!!

对于负数来说

0的原码、反码、补码

0的原码

0的反码

0的补码

负数的原码和补码的互相转换

原码->补码

补码->原码

原码的取值范围和最值

补码的取值范围和最值

大小端存储方式

什么是大端小端:

为什么有大端和小端:

大小端本质


数据类型

signed 和 unsigned 详细解释

signed 和 unsigned都可以修饰int、short、float、char等数据类型

signed 表示 有符号的,带signed的变量可以存放负数

unsigned 表示 无符号的,带unsigned的变量不可以存放负数,只能存放 0 和 正数

例子:

ch1和a1变量是可以存放负数的,ch2和a2变量只能存放 0 和 正数

signed char ch1;
unsigned char ch2;

signed int a1,
unsigned int a2;

但是,signed char 其实就是 char类型,也就是说 signed char 相等于 char,int类型,float等数据类型也是如此。

数据类型都满足下面这个语法规则:

signed + 数据类型 == 数据类型

(== 在计算机里是相等的意思)

signed 是可以省略不写的!

不过一般我们建立新变量的时候,不用加上 signed 。

比如:我们要建立一个有符号的char变量

我们只要这样就行了

char ch;

不用在char前面加上signed。

unsigned一般用于无负数的数值,比如身高、体重、个数。

整型家族

char

unsigned char、[signed] char

short

unsigned short [int]、[signed] short [int]

int

unsigned int、[signed] int

long

unsigned long [int]、[signed] long [int]

方括号[]里面的内容可以省略不写。

浮点数家族

float

unsigned、signed都可以修饰。

double

unsigned和signed都可以修饰。

构造类型(详情可见我已更新blog)

数组类型

结构体类型 struct

枚举类型 enum

联合体类型 union

指针类型(详情可见我已更新blog)

int* pi;

char* pc;

float* pf;

void* pv;

空类型

void 表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型等。


原码、反码、补码

整型的二进制表示:

原码、反码、补码

正整数的原码、反码、补码相同!!!

int类型大小是4个字节,可以存放32个bit位,即存放32个二进制数。

一个bit位存放一个二进制数。

最高位bit位是符号位。

符号位是0,表示正数。

符号位是1,表示负数。

unsigned int 没有符号位。

对于负数来说

反码 等于 原码符号位不变,其他位取反。

补码 等于 反码 + 1。

 整数在计算机里用的是补码储存,整数计算也是用补码计算。

用原码计算会出现错误!

0的原码、反码、补码

0的原码

+0 

00000000 00000000 00000000 00000000

-0

10000000 00000000 00000000 00000000

0的反码

+0

00000000 ​​​​​​​00000000 ​​​​​​​00000000 ​​​​​​​00000000

-0

11111111 11111111 11111111 11111111

0的补码

+0和-0都只有一种表示

00000000 ​​​​​​​00000000 ​​​​​​​00000000 ​​​​​​​00000000

负数的原码和补码的互相转换

原码->补码

①除符号位,其他位取反。

②加1

补码->原码

方法一:

①减1

②除符号位取反

方法二:

①除符号位取反

②加1

 

原码的取值范围和最值

如果有n位二进制数,则最大正数为2^{n-1}-1(01111111  11111111 11111111 11111111)原码形式,

减1是因为+0占了一个数的位置(00000000 00000000 00000000 00000000)原码形式。

最小负数-(2^{n-1}-1)(11111111 11111111 11111111 11111111)原码形式,

减1是因为-0占了一个数的位置(10000000 00000000 00000000 00000000)原码形式。

取值范围 -(2^{n-1}-1)~ (2^{n-1}-1)

反码类似原码,在这就不多说了。

补码的取值范围和最值

如果有n位二进制数,则最大正数为2^{n-1}-1(01111111  11111111 11111111 11111111)补码形式,

减1是因为0占了一个数的位置(00000000 00000000 00000000 00000000)补码形式。

如果有n位二进制数,则最小负数为-2^{n-1}(10000000 00000000 00000000 00000000)补码形式。

取值范围 -(2^{n-1})~ (2^{n-1}-1)


大小端存储方式

什么是大端小端:

大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址 中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地 中。

为什么有大端和小端:

为什么会有大小端模式之分呢?
这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit 。但是在 C 语言中除了 8 bit char 之外,还有 16 bit short
型, 32 bit long 型(要看具体的编译器),另外,对于位数大于 8 位的处理器,例如 16 位或者 32 位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将 多个字节 安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个 16bit short x ,在内存中的地址为 0x0010 x 的值为 0x1122 ,那么 0x11 高字节, 0x22 低字节
对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。
小端模式,刚好相反。
我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM DSP 都为小端模式。有些 ARM 处理器还可以由硬件来选择是大端模式还是小端模式。
例子:
int a = 1;//换算成二进制补码就是 00000000 00000000 00000000 00000001
小端存储

 大端存储

 这个图中a和b变量存储的数是二进制补码形式,图中被红色方框框住的数是补码转化为十六进制的数。运行环境是VS2013,不难看出VS采用的是小端存储模式。

大小端本质

一个数值的多个字节在地址中存储的顺序不同!!!


如果你喜欢这篇文章,那就点赞收藏走起来吧!!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值