【数据类型】

        整数在存储器里的存储模式

        前面已经提到了地址,那么计算机到底如何保存我们输入的东西呢,很明显计算机不像我们人一样,计算机有属于自己的一套语言,它会把我们输入的东西转化为它看得懂的东西,所以计算机储存的东西其实就是补码。

        今天以整数为例子,整数在计算机中就是以二进制补码的形式存放的,补码其实也比较简单,就是一句话:正数的补码就是其原码本身,负数的补码是该负数绝对值的原码取反再加1,来看个简单例子:

求255和-255的的补码(8bits)

首先先要找到255的原码,由于255=256-1,所以255的原码就是:1111  1111

那么255的补码就是:1111 1111.

根据上面提到的,负数的补码就是整数的补码取反再加一

我们先把255的补码取反得到:0000  0000,然后在此的基础上加一

所以-255的补码就是:0000  0001.

        值得注意的是,一个正数的补码总会有个对应的负数的补码与之相同,我们不难发现,-1和255,-2和254,他们的补码分别相同也就是说:-x=2^{n}-x(等号仅仅代表补码相等)n代表的是比特位数,所以当出现一个补码的时候,这个补码代表的是两个数中其中一个。

        在cpu底层没有符号位的概念,都是数值位, 参与运算, 这个数是正数还是负数.

看你编译器的词义, 意识是说,你是把这个数当作一个有符号数(signed),还是一个

无符号数(unsigned) 来解释,那么这里肯定会有人疑惑,-1和255的补码相同,怎么回事,那岂不不是区分不了了?

确实,但其实我们会发现在8bits的情况下-1和255确实完全无法区分,但是这只是因为截断造成的,说简单点,255的补码前面可以无限加0它也还是代表255,-1前面同样前面可以加上1,这就是引入符号位的作用,-1和255得到了区分,但是前面说到的在char也就是8bits的运算当中-1和255就是没有区别的,+(-1)和+(255)得到的值相同,因为计算过程会有溢出的情况。

        不同整型之间的赋值问题

        首先明确,不同整型之间可以相互赋值,其次不同整型之间要想相互赋值就得遵循相应的规律。那么呢,C语言标准委员会建议:

1.长的 -> 短的        

低字节直接拷贝, 高字节直接舍弃(这里就会出现溢出的问题了)

2.短的 -> 长的

低字节直接拷贝,高位补什么?

如果短的是无符号,高位全部补0.

如果短的是有符号,高位全部补符号位.

        ok,补码差不多就是这些东西了,这里留下几个题目方便日后能快速复习

int main()
{
    char c = 250;
    printf("%d\n",c);//-6
    printf("%u\n",c);//2^32 - 6
    //c : 1111 1010
    //%d : c -> int 短 -> 长
    // 11111111 11111111 11111111 1111 1010
    //最高位为1,表示这个数是一个负数
    //-1   11111111 11111111 11111111 11111001
    //取反  00000000 00000000 00000000 00000110  绝对值为6, 这个数是-6
    
     //c : 1111 1010
     //%u : c -> unsigned int 短 -> 长
     //  11111111 11111111 11111111 1111 1010  把这个数当作一个无符号
    
    return 0;
}

        

printf("%d\n",(unsigned char)255);
printf("%u\n",(unsigned char)255);
	//255 : 00000000 00000000 00000000 11111111
	//%d : int -> c 长 -> 短
	//255: 11111111
	//%d : c -> int 短 -> 长
	//255:00000000 00000000 00000000 11111111 == 255

	//255 : 00000000 00000000 00000000 11111111
	//%u : int -> c 长 -> 短
	//255: 11111111
	//%u : c -> int 短 -> 长
	//255:00000000 00000000 00000000 11111111 == 255

        记得刚开始学的时候老是以为%u就是代表无符号了,然后看见%u在做短变长的时候就想在前边加0,但是%u是转义说明,代表输出格式为十进制无符号整数,判断他到底是有符号还是无符号,是要看定义,也就是数据类型!!!! 

        常量的形式

        八进制常量0[0-7]* : 以数字0开头,后面接0个或多个01234567

        十六进制常量:0[xX][0-9a-fA-F]+ : 以0x或者0X开头,后面接至少一个16进制字符

        十进制常量:[0-9]+:至少有一个0到9中的数字

        字符常量

        字符常量是由一个单引号引起来来的一个或多个字符序列,比如'A'代表字符A,'\n'表示换行符。我们在计算机中保存一个字符的时候,并不是把这个字符的样子保存下来,而是每一个字符都对应了ASCLL表上的一个编码,而美国通用的字符加起来总共不超过256个所以,只需要一个字节就可以保存了。

        字符也分为两类,普通字符和特殊字符(转义字符),还要注意区分字符常量和字符串常量,字符常量是用单引号引起来,而字符串常量是要用双引号引起来比如:

'0' '\101' --> 单个字符

"0" => 字符串

"abc" ==> 字符串 里面有四个字符 a b c '\0'

        浮点型常量

        浮点型常量可以理解成小数就ok,但是在写浮点型常量时可以省去整数部分(我之前在百度百科中看见小数部分也是依然可以省去的)但是,小数和整数部分绝不能同时省掉,如果同时省去小数部分和整数部分的话,计算机就会把这个浮点型当成一个变量名

typeof(1.0) : double  C语言默认的类型是double
typeof(1.0f) : float
typeof(1.0l) : long double
typeof(1)   :  int

        枚举常量和符号常量

        这也在后面再说。

        今天就到此为止了,在复习就不礼貌了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值