C语言中short和unsigned short的取值问题和计算机组成原理

恭喜你找到了宝藏,本篇内容非常清晰明了

1.基础了解

在这里插入图片描述

先看图,short 和unsigned short的字节数是2,也就是说有2Byte,也就是说 16bit ,
即二进制 0000 0000 0000 0000

2.取值问题

short是带正负号的, 所以取值范围不同,但是最大值和最小值差是一样的

short 32767-(-32768)= 65535
unsigned short 65535-0 = 65535 ,表示为二进制就是 1111 1111 1111 1111
为什么是这个取值呢?因为
2的15次方:32768
2的16次方:65536

3.补码问题

正常人类理解,short取值为十进制的-1时,应表示为 1000 0000 0000 0001
而计算机不会进行“减”运算,都是进行“加”运算,所以1-1,会被计算机解释为 1+(-1)
short s1 = 1; 二进制 0000 0000 0000 0001
short s2 = -1;二进制 1000 0000 0000 0001
short s3 = s1+s2= 0 ;二进制0000 0000 0000 0001+1000 0000 0000 0001=1000 0000 0000 0010

上面s3的二进制

1000 0000 0000 0010

转化为十进制s3-2 而不是0,这是什么情况????

就是为了解决这一问题,才在计算机中引入了补码。
在这里插入图片描述
补码是正数不变,
负数是符号位不变,后面诸位取反,末位加一,-1由原来的
1000 0000 0000 0001,变成了 1111 1111 1111 1111
我们再重新计算一下

short s1 = 1; 二进制 0000 0000 0000 0001
short s2 = -1;二进制 1111 1111 1111 1111
short s3 = s1+s2= 0 ;
二进制0000 0000 0000 0001+ 1111 1111 1111 1111=(溢出一位1)0000 0000 0000 0000
还是用程序看起来更为直观:
在这里插入图片描述
运行结果下图所示(图中的0x意思就是16进制表示)
C语言程序默认将1前面的0都被省略了,并且默认%d输出出来是2字节,所以s2是八个f …非常尴尬
在这里插入图片描述

输出结果修正:

s1 = 1;十六进制 0001 ;二进制 0000 0000 0000 0001
s2 = -1;十六进制 f f f f ; 二进制 1111 1111 1111 1111
s3 = 0;十六进制 0000 ; 二进制 0000 0000 0000 0000

再看一个例子(二进制中,两个正数s1、s2前面的0再一次被省略,这个符号位0表示是正数)
在这里插入图片描述

### 回答1: 有什么区别? unsigned short unsigned short int 是等价的,都表示无符号短整型,它们的取值范围都是 到 65535。在 C 语言中,short short int 也是等价的。 ### 回答2: C的数据类型中,unsigned shortunsigned short int是等价的,都表示无符号短整数。 unsigned表示无符号,也就是没有正负号,只能表示非负整数。short表示短整数,占2个字节(16位),范围为0到65535。 unsigned shortunsigned short int虽然在写法上有差异,但语义上是完全一样的,都表示相同的数据类型。在C语言中,类型名可以省略int关键字,所以unsigned shortunsigned short int是等效的写法。 这两个类型常用于对不需要负数的整数进行存储处理。由于省略了符号位,无符号整数类型可以表示更大的正数范围,但不能用来表示负数或需要进行算术运算的场景。 通过使用unsigned short(int)类型,我们可以节省内存空间,特别是在对大量非负整数进行存储计算时。然而,在使用该类型时需要注意溢出问题,因为它的取值范围有限,当数据超过该范围时可能会导致数据丢失或错误结果。 总的来说,unsigned shortunsigned short int都表示无符号短整数类型,在C语言中可以互换使用,都适用于存储处理不需要负数的非负整数数据。 ### 回答3: c语言中,unsigned short unsigned short int 是相同的数据类型,用来表示无符号的短整数。unsigned short 被广泛使用,unsigned short int 则是对该类型的完整命名。在C语言中,short int int 可以互换使用,因此 unsigned short int 也可以简写为 unsigned shortunsigned short unsigned short int 可以保存范围在0到65535之间的整数值。其中,unsigned 表示该类型的变量只能保存非负的数值,short 表示该类型的变量占用的内存空间较小,通常为2个字节。因此,unsigned short unsigned short int 可以用来节省内存空间,特别适合用于表示较小的正整数。 由于 unsigned short unsigned short int 并无本质区别,所以在使用时可以视个人习惯来选择使用哪种命名方式。根据C语言的命名规范,一般情况下建议使用 unsigned short,因为它更加简洁明了。但是,在某些特定场景中,也可以使用 unsigned short int 来强调该变量的数据类型,提高代码的可读性。 总之,unsigned short unsigned short int 都是C语言中表示无符号短整数的数据类型,没有实际上的差别,只是在命名上稍有不同。在使用时可以根据个人习惯项目要求选择合适的命名方式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值