C语言中的数据存储方式

这篇文章主要是关于C语言中整形、字符型的变量是如何存储整形数字、是如何、何时发生整形提升,以及还有打印方式的不同打印的数字也不同的知识补充。



int与unsigned int:

int是在内存中是4个字节,也就是8*4=32个比特位的存储方式,是带正负号的整形。
unsigned int在内存中也是占4个字节,32个比特位,但是它是不带正负号的整形。


所以当一个负数存放到unsigned int类型的变量里面时:
负数在二进制存储的时候第一个数字是1,当以补码的形式将负数存储到unsigned int的时候,数字会变得很大。

例如:
我将-1赋值给unsigned int类型的变量i上,如果按照赋值给int类型的方式去理解的话,打印出来的i应该是-1,但是其实赋值得到的数是4294967295。

从调试的时候监视去看i的值:

从内存存储的时候去看i在内存中的存储:

ffffffff是十六进制的数,换做为二进制就是11111111111111111111111111111111。
所以将-1赋值给unsigned int类型的时候就是直接将补码当作原码的。

 
所以当int类型和unsigned类型的数据一起计算时,根据算数转换,int类型会变成unsigned类型去进行计算,然后将补码直接当作原码存储到unsigned int类型变量中。



char与unsigned char
char和unsigned char都是在内存中占1个字节,所以占8个比特位,根据其只占8个比特位,所以数据的存储也受到限制。

当赋值给char类型的时候,是带有正负号的字符型变量,因此第一个比特位跟int类型一样作为符号位。
当赋值给unsigned char类型的时候,是不带正负号的,因此第一个比特位不作为符号位。
所以当char和unsigned char类型的变量一起计算的时候,与int、unsigned int一样的,char会变成unsigned  char进行计算。
具体存储方式可以参考以上的int与unsigned int的。

由于只占8个比特位,且char类型是带正负号的,第一个比特位要作为符号位,所以char类型的数字存储的时候范围是-128-127。
而unsigned char类型的变量范围是0-255。

所以当赋值的数字超过该范围,会发生截断,例如将数字256赋值给unsigned char类型变量,此时256有9位比特位,也就是100000000,因为只存储8位,就发生截断,只取后8位赋值给变量,也就是说最后截断后的二进制是:00000000,赋值给变量得到的值是0。



当char、unsigned char、int、unsigned int类型的变量进行计算
算数转换关系是:
char < unsigned char < int < unsigned int
也就是说当他们四个或者其中几个类型变量共同出现在计算式的时候,他们会发生从左到右的算术转换。


1:当char与int一起计算时:将数字赋值给char类型变量时,先变成补码,如果要发生截断则先截断,再赋值给char类型变量,然后遇到int的时候发生整形提升,如果是负数则向左补1,如果是正数则补0,一直补到第32位。

2:当unsigned char与int一起计算时,将数字赋值给unsigned char类型变量时,同样先变成补码再赋值,然后如果要截断就发生截断,遇到int的时候发生整形提升,但是这里向左补的数字只能是0,补到第32位。因为unsigned char是无符号的数字。





当用%d进行打印和用%u进行打印的区别:
%d打印时:
是打印带符号的数字,如果是像上面将-1赋值给unsigned int类型的变量i,如果用%d打印的话,i的原码应该是11111111111111111111111111111111,而因为%d打印是带符号的打印方式,所以会将i视作负数,因此按照负数的方式打印的话,会将该11111111111111111111111111111111变成10000000000000000000000000000001进行打印,也就是-1。

%u打印时:是打印不带符号的数字,因此当变量符号位是否是1,也就是说打印的数字是否是负数还是正数,都会被当作无符号的数字进行打印。例如将-1赋值给int类型,int类型变量可以存储带正负号的数字,正常情况下打印出来是-1,但是由于是%u打印,-1的补码是11111111111111111111111111111111,就是按照该补码视作原码进行打印:

 


 




 

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 13
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值