修炼基础之C语言数据类型专题一

1.数据在内存中存储形式:小端存储,高位数存放在高地址,低位数存放在低地址(以16进制的形式)。如:int ia=0x12345678;// ia在内存中如下图形式存储。

2.计算机存储整型数据是以补码的形式存储!(正数原码、反码、补码相同;负数补码=原码除符号位,取反加一)。CPU只能进行加法运算(5-5=5+(-5))

char ch=5; //char为1字节(8个二进制位)5的补码与原码相同:0000 0101

char ch=-5; //-5:1000 0101(原码)、1111 1010(反码)、1111 1011(补码)

若有如下定义:char a=3456; //该数太大了,转为二进制后需要裁低八位(char1字节,8位)

其实最正确的求补码方法是:正数:原码、反码、补码相同,转为2进制后裁取对应的位即可;负数:用2^(类型对应字节数对应的位:bit)的二进制数-不带负号的该数的二进制

如char ch=-5; //char类型1字节,8位。2^8(二进制)-5(二进制)=1 0000 0000-00000101=1111 1011(直接结果就为-5的补码)

再如char a=-128; //a=2^8(二进制)-128(二进制)=1 0000 0000-1000 0000=1000 0000(为-128的补码)

3.为什么下面这段代码会进入无限循环呢?

#include<stdio.h>
int main() {
	for (char ch= 0; ch < 128; ch++) {
		printf("%5d", ch);
	}
}

该代码运行结果为:0~127,-128~-1的无限循环。其实就是char类型的表示范围(是一个循环的闭环,表示范围0~127(状态个数128),表示范围-128~-1(状态个数128)),-1为最大的负数。

对于127+1=-128的解释:127=0111 1111,127+1=0111 1111+0000 0001=1000 0000=-128(对于有符号的char类型来说:该数首位的1既是符号位又是数值位

对于-1+1=0的解释:-1=1111 1111(补码),-1+1=1111 1111+0000 0001=1 0000 0000(由于char类型为1字节8位,故截取低八位)=0000 0000=0

由此才形成了循环的闭环:0  1  2......127  -128  -127...-1 0......

4.对于无符号char类型unsigned char,最高位永远表示数值位,状态个数256,表示范围0~255(1111 1111)。

因此8位全是1:1111 1111究竟是255(无符号)还是-1(有符号)其实取决于我们自己定义的类型。

5.对于短整型(有符号):2个字节~16bit,由16个二进制位组成,最高位为符号位!状态个数:65536,表示范围:0~32767,-32768~-1(补码16位均为1即为-1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值