计算机中数据的编码方式

一.整数的表示

由于计算机只能识别二进制的0和1,在存储数据时就涉及到了对数据的编码问题,计算机中对整数的编码有两种不同的方式,分别为:
1. 只能表示非负数,此种类型数据称为无符号类型 即 unsigned 
2. 能表示负数0和正数,此种类型数据称为有符号类型 signed

二.整型数据类型的表示范围

C语言支持多种整型数据类型--表示有限范围的整数,

32位环境整型数据的取值范围:

C数据类型

字节数

编码方式

能表示的最小值

能表示的最大值

unsigned char

1

原码

0 (0x00)

128 (0xFF)

char

1

补码

-128 (0x80 )

127 (0x7F)

unsigned short

2

原码

0 (0x00 00)

65535(0xFFFF)

short

2

补码

-32768(0x8000)

32767(0x7FFF)

unsigned int

4

原码

(0x0000 0000)

(0xFFFF FFFF)

int

4

补码

(0x8000 0000)

(0x7FFF FFFF)

unsigned long

4

原码

(0x0000 0000)

(0xFFFF FFFF)

long

4

补码

(0x8000 0000)

(0x7FFF FFFF)

unsigned long long

8

原码

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long long

8

补码

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)

 32位环境的验证:

sizeof(char) = 1byte
sizeof(unsigned char) = 1byte
sizeof(short int) = 2byte
sizeof(unsigned short int) = 2byte
sizeof(int) = 4byte
sizeof(unsigned int) = 4byte
sizeof(long) = 4byte
sizeof(unsigned long) = 4byte
sizeof(long long) = 8byte
sizeof(unsigned long long) = 8byte

64位环境整型数据的取值范围: 


C数据类型

字节数

编码方式

能表示的最小值

能表示的最大值

unsigned char

1

原码

0 (0x00)

128 (0xFF)

char

1

补码

-128 (0x80 )

127 (0x7F)

unsigned short

2

原码

0 (0x00 00)

65535(0xFFFF)

short

2

补码

-32768(0x8000)

32767(0x7FFF)

unsigned int

4

原码

(0x0000 0000)

(0xFFFF FFFF)

int

4

补码

(0x8000 0000)

(0x7FFF FFFF)

unsigned long

8

原码

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long

8

补码

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)

unsigned long long

8

原码

(0x0000 0000 0000 0000)

(0xFFFF FFFF FFFF )

long long

8

补码

(0x8000 0000 0000 0000 )

(0x7FFF FFFF FFFF FFFF)



64位环境的验证;

sizeof(char) = 1

sizeof(unsigned char) = 1

sizeof(short int) = 2

sizeof(unsigned short int) = 2

sizeof(int) = 4

sizeof(unsigned int) = 4

sizeof(long) = 8

sizeof(unsigned long) = 8

sizeof(long long) = 8

sizeof(unsigned long long) = 8


三.无符号数的编码

计算机对无符号数的编码方式采用原码的形式,假设一个整数数据类型有 w 位。我们可以将位向量写成 x→,表示整个向量,或者写成 [xw-1 ,xw-2,…,x0],表示向量中的每一位。把 x→看做一个二进制表示的数,就获得了 x→的无符号表示。可以用一个函数 B2Uw(Binary to Unsigned)的缩写,长度为 w)来表示 :

 函数B2Uw将一个长度为w的0,1串映射到一个非负数,具体的示例如下:

B2U4([0001]) = 0 * 2^3 + 0 * 2^2 + 0 * 2^1 + 1 * 2^0 = 0 + 0 + 0 + 1 = 1
B2U4([0101]) = 0 * 2^3 + 1 * 2^2 + 0 * 2^1 + 1 * 2^0 = 0 + 4 + 0 + 1 = 5
B2U4([1011]) = 1 * 2^3 + 0 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 0 + 2 + 1 = 11
B2U4([1111]) = 1 * 2^3 + 1 * 2^2 + 1 * 2^1 + 1 * 2^0 = 8 + 4 + 2 + 1 = 15
无符号编码方式下w位可表示的范围:
最下值:[000......0] = 0
最大值:[111......1] = 2^w - 1;
总结:一个w位的二进制可表示的无符号类型整数的范围是0 — 2^w -1;

四. 有符号整数的编码
实际的应用中,会需要负数的值,最常用的有符号数的编码方式为补码编码,在这个定义中,将字的最高有效位解释为负权(negative weight)。我们用函数 B2Tw(Binary to Two’s-complement 的缩写,长度为 w)来表示

最高有效位 xw-1 也称为符号位,它的“权重”为 -2^(w-1),是无符号表示中权重的负数。符号位被设置为 1 时,表示值为负,而当设置为 0 时,值为非负.具体的编码示例如下:

B2T4( [0001] ) =0* 2^3 + 0 *2^2 + 0 *2^1 +1* 2^0 = 0 + 0 + 0 + 1 = 1
B2T4( [0101] ) =0 * 2^3 +1 *2^2 + 0 *2^1 +1* 2^0 = 0 + 4 + 0 + 1 = 5
B2T4( [1011] ) =1 * 2^3 +0 *2^2 + 1 *2^1 +1* 2^0 = −8 + 0 + 2 + 1 = −5
B2T4( [1111] ) =1 * 2^3 +1 *2^2 + 1 *2^1 +1* 2^0 = −8 + 0 + 2 + 1 = −1

有符号编码方式下w位可表示的范围:
让我们来考虑一下 w 位补码所能表示的值的范围。它能表示的最小值是位向量 [10…0](也就是设置这个位为负权,但是清除其他所有的位),其整数值为-2^(w-1),而最大值是位向量[01…1](清除具有负权的位,而设置其他所有的正权位)其整数值为2^(w-1);
所以范围为:-2^(w-1) ——2^(w-1);


转载于:https://www.cnblogs.com/jianghg/p/4417191.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值