浅谈C语言中的数的转化与运算

浅谈C语言中的有符号和无符号数的转化(读《深入理解计算机操作系统(第三版)》有感)

通常在计算机系统里,一个字节由8位组成,范围即为 [ 0 , 255 ( 2 8 − 1 ) ] [0,255(2^8-1)] [0,255(281)]
计算机系统里,通常声明的类型的字节数和范围如下:

有符号无符号32位64位
charunsigned char11
shortunsigned short22
intunsigned int44
longunsigned long48
int32_tuint32_t44
int64_tuint64_t88
void *44
float44
double88

对于任意有符号类型,若字节数为w,那么其范围为 [ − 2 8 ∗ w − 1 , 2 8 ∗ w − 1 − 1 ] [-2^{8*w-1}, 2^{8*w-1}-1] [28w1,28w11]
对于任意无符号类型,若字节数为w,那么其范围为 [ 0 , 2 8 ∗ w − 1 ] [0, 2^{8*w}-1] [0,28w1]
例如:
32位下的int类型,占用4个字节,其范围为 [ − 2 31 , 2 31 − 1 ] [-2^{31}, 2^{31}-1] [231,2311],64位下的unsigned long类型,占用8个字节,其范围为 [ 0 , 2 64 − 1 ] [0, 2^{64}-1] [0,2641]

下面介绍数据在计算机中的存储方式,包括原码,反码,补码
对于正整数而言,其原码,反码,补码相同,就是二进制码,例如:

short x = 53191;

其二进制表示为 ‭ 1100 , 1111 , 1100 , 0111 ‭1100,1111,1100,0111 1100111111000111,其原码,反码,补码都是这样的。
对于负数而言,就多了一位符号位,符号位在首位,例如:

short x = 12345;

其二进制表示为 ‭ 0011 , 0000 , 0011 , 1001 ‬ ‭0011,0000,0011,1001‬ 0011000000111001,那么-12345的原码就是在此基础上,将首位的零变成符号位1即 1011 , 0000 , 0011 , 1001 ‬ 1011,0000,0011,1001‬ 1011000000111001

short x = -12345;
//原码:1011,0000,0011,1001‬
//反码:1100,1111,1100,0110(在原码基础上,符号位不变,其余取反)
//补码:1100,1111,1100,0111(在反码基础上加1)
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值