C语言中unsignedinta=-10,这种写法是否正确?-创新互联

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

武侯ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为成都创新互联公司的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:13518219792(备注:SSL证书合作)期待与您的合作!

 首先我们需要了解一个数据是怎么存储的,就比如说需要存储这个-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这种写法并没有错误。你学会了吗?

补充:

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

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

原码>反码>补码

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

补码>原码

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

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

你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧


文章标题:C语言中unsignedinta=-10,这种写法是否正确?-创新互联
当前网址:http://ybzwz.com/article/ccpddc.html