unsigned关键字的学习

在C语言里面有一个关键字unsigned,这个关键字是用来声明无符号类型。一个 32 位的 signed int 类型整数其值表示法范围为: – 2³¹~ 2³¹-1 ;一个 32 位的 unsigned int 类型整数其值表示法 范围为: 0~ 2³² -1,这是为什么呢,我们来仔细看看,首先32位中一个int型是占4bit,也就是4 * 8个二进制数字,然后由于它是signed所以,第一个是用来表示符号的,所以它能表示的数字的范围就是 – 2³¹~ 2³¹-1,而unsigned由于没有表示符号的那个数字,所以它的表示范围就是0~ 2³² -1,弄清楚了这个,我们再来看一个程序:

#include <stdio.h>
void main()
{
    unsigned int a = 1;
    int b = -1;
    if(a > b)
    {
        printf("a > b");
    }
    else
    {
        printf("a < b");
    }
}

它的输出结果会是什么样呢?答案是a < b,在计算机的运行里面unsigned的1是比signed -1要小一些。这里这涉及到自动类型转换。
原则:
若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。
转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。
所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
char型和short型参与运算时,必须先转换成int型。
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。
下面箭头指向的就是隐式转化的方向:
short and char ->int ->unsigned -> long ->double <-float;
int a = -1,那么他就先转化成unsigned那个数字一定是比1要大的,所以就是a < b;

#include<stdio.h>
#include<stdlib.h>
void main()
{
  int a = -3;
  unsigned int b = 2;
  long c = a + b;
  printf("%ld\n",c);
}
A.-1
B.4294967295
C.0x7FFFFFFF
D.0xFFFFFFFF

大家可以再分析一下这题先把int换成unsigned,具体是多少,大家可以算一下,也可以通过编译器来自己完成这个工作。且看代码

#include <stdio.h>
void main()
{
    int a = -3;
    printf("%u",a);
}

得到它的值为4294967293,再与unsigned int b = 2;相加可以得到具体的值了,但是这里要注意,你的机器不同(32,64)得到的值也不同,32位中得到的值就是-1;64位中就是4294967295;这与所占内存多少有关(64位编译器中long是8bit,装得下)所以就会得到两个答案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值