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

简介: 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这种写法并没有错误。你学会了吗?


补充:


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

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

原码>反码>补码

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

补码>原码

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

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


相关文章
|
1月前
|
存储 编译器 C语言
c语言中int的作用和类型
c语言中int的作用和类型
27 0
|
6月前
|
存储 C语言
C 语言实例 - 计算 int, float, double 和 char 字节大小
C 语言实例 - 计算 int, float, double 和 char 字节大小。
35 1
|
3月前
|
存储 人工智能 编译器
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
learn_C_deep_5 (温故知新、sigend char a = -128的深度理解、unsigned int类型的写法规范)
|
3月前
|
存储 编译器 程序员
learn_C_deep_4 (类型和变量命名、sizeof(int) *p表示什么意思、原码、反码和补码的概念、计算机中数据计算时,为什么要转为二级制、unsigned和signed关键字)
learn_C_deep_4 (类型和变量命名、sizeof(int) *p表示什么意思、原码、反码和补码的概念、计算机中数据计算时,为什么要转为二级制、unsigned和signed关键字)
|
3月前
|
C语言
[C语言][题]两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同。
[C语言][题]两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同。
19 1
|
3月前
|
C语言
C语言中通过INT_MAX判断两个非负整数相加是否溢出
C语言中通过INT_MAX判断两个非负整数相加是否溢出
33 0
|
3月前
|
存储 C语言
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
学习总结(位操作符;循环输入的三种方式;交换两个变量值的三种方法;打印数字对应的二进制;unsigned int 与int 的区别;改变特定位数0/1;&&和||的连续操作(与前置,后置结合))
32 0
|
9月前
|
编译器
unsigned long int 和 unsigned long一样吗?
unsigned 代表的是无符号的整形数
146 0
|
4月前
|
存储 安全 程序员
【c语言】重温一下动态内存,int数组过大会造成栈错误
【c语言】重温一下动态内存,int数组过大会造成栈错误
45 0