C语言中unsigned int a=-10,这种写法是否正确?

       在学习C语言的时候偶尔看到了一个这样的代码,unsigned int a=-10;乍一眼看上去这不就是错的吗?一个负数怎么能够放到一个无符号整形里面去。如果你这样想,那你就有必要看看我这篇文章了。

       首先我们需要了解一个数据是怎么存储的,就比如说需要存储这个-10,首先就需要创建一个变量a,创建变量a,需要在栈区开辟一块内存空间,而因为计算机只认识二进制的数据,所以这个-10需要先转换成二进制的形式,换句话说,在数据存储到内存之前数据自身就已经准备好了存放到内存所需要的格式了,所以数据存储根本就不关心把数据存到的那个变量的类型是什么,反正我就准备好了一个二进制的补码给你,你给我存进去,你是什么类型根本就不影响我这个数据的内容,因为在放进内存之前我就已经准备好了,那如果这样说的话,这个unsigned int 类型在这里有什么意义呢?为什么还要写这个类型呢?

       虽然这个unsigned int 在数据存进去的时候没有什么作用,但是它肯定有自己的作用的,它的作用其实体现在取出数据的时候,当你的变量是signed int类型的时候,编译器会把内存中的这个数据当作有符号数处理,即取出的时候会按照原码,反码,补码的规则把这个补码转化成原码,(原码,反码,补码的转换规则在文章结尾)得到的就是原码就是1000 0000 0000 0000 ...1010,其中第一位看作符号位,1表示这个数是负数,所以取出来的数就是-10,而如果你的变量是ungigned int 类型的时候,那么编译器就会把内存中的这个补码看成是无符号的,即第一位也看成是有效位,而且无符号数的原码,反码,补码是一样的,所以翻译出来的原码是1111 1111 1111 1111 ...  1111 0110了,所以取出来的数是4294967286。

        总结:

        变量存的过程:

        字面数据必须先转成补码,再放入空间当中,所以,所谓符号位,完全看数据本身是否携带+-号,和变量是否有符号无关。

        变量取的过程:

        取数据一定要先看变量本身类型,然后才决定要不要看最高符号位,如果不需要,直接二进制转成十进制,如果需要,则需要转成原码,然后才能识别。(当然符号位在哪里,又要明确大小端)

       所以unsigned int a=-10这种写法并没有错误。你学会了吗?

补充:

原码,反码,补码转换规则:

正数和无符号数的原码,反码,补码是一样的,无需转换。而负数需要转换。

原码>反码>补码

原码的符号位不变,其他位按位取反得到反码,反码加一得到补码。

补码>原码

方法一:补码减一,再符号位不变,其他位按位取反得到原码。

方法二:补码再做一遍从原码变成补码的步骤,即补码的符号位不变,其他位按位取反(需要注意的是这里得到的结果并不是反码),得到的结果加一也能得到原码。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值