计算机常用的容量单位
2 10 = 1K
2 20 = 1M
2 30 = 1G
2 40 = 1T
2 32 = 22*230=4G
213 = 23*210=8K
8bit 可以表示 28=256钟状态
内存是以字节为单位操作的
软件中的最小单位 1B = 8bit
C语言数据类型及容量
变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式
ANSIC 规定:
char 是1B
long 类型不小于4B
char <= short <= int <= long
short 一般2B
int 整型本质上来说表示CPU的处理能力
一些单片机或低位系统 int 2B,PC常见 4B
long windows 4B, linux64位 8B
怎么判断在自己编译器的具体规则呢?
利用sizeof()把int, long 大小打出来。
常见uint8_t、int32_t、是对数据类型容量见名知意的别名
无符号int 类型8位, 有符号int 类型32位,_t表示用typedef 起的别名
C语言默认数据输入的进制格式
数据在计算机中都是以补码的形式保存的。
- 单纯的默认都是10进制的形式:a = 10;
- 0x表示16进制:a = 0xcc;
- 0b表示2进制:a = 0b11110001;
- 0开头表示8进制:a = 010;
赋值操作
= :把等号右边的内存中的01,2进制数据,逐一拷贝到左边
前面提到过变量类型
变量的类型决定了变量存储占用的空间,以及如何解释存储内存上的2进制串
涉及到赋值就要考虑容量大小的问题
整形常量 默认 int大小 4B.
char 是 1个字节。大容量向小容量赋值,截断,存储低位数据。
char a = 0x12345678;
其实赋值后,a 在内存上数据存储的2进制数据是0x78;
C语言中的 赋值 只关注等号两边的容量大小,拷贝的是内存上纯粹的2进制数据串,而容量的大小是由数据类型来约束的。
数据类型不仅约束了内存区域上容量大的大小,而且又分了有符号和无符号影响后续操作。
不管正负数据,在计算机中都以补码形式存储
数据左右移动的符号问题
有无符号关注后续操作
当数据左移的时候,添0即可。
当数据右移时,看其是否是有符号数。若是无符号数,添0;若是有符号数,添加符号位。
/*
【基础题】已知代码如下,请写出执行结果:
int main() {
unsigned int b = -100;
printf("%d\t%u\t%x\n", b, b, b);
printf("%d\t%d\n", b >> 1, b << 1);
return 0;
}
-100在计算机(4B)中的存储形式
1111 1111 1111 1111 1111 1111 1001 1100
%x f f f f f f 9 c
%u 4294967196
%d -100
逻辑右移动 填0 unsigned int
算术右移 填符号位
1111 1111 1111 1111 1111 1111 1001 1100
逻辑右移 >>1
0111 1111 1111 1111 1111 1111 1100 1110>>0
%x d f f f f f c e
%u 3,758,096,334
%d 2,147,483,598
<<1
1111 1111 1111 1111 1111 1111 1001 1100
左移(应该就在右边补0)
1<<1111 1111 1111 1111 1111 1111 0011 1000
%x f f f f f f 3 8
(最左边符号位1:代表负数,此时是补码形式)
%d 显示负数时,会将负数的补码转换成原码加上符号输出
补码
1111 1111 1111 1111 1111 1111 0011 1000
反码
1111 1111 1111 1111 1111 1111 0011 0111
原码
1000 0000 0000 0000 0000 0000 1100 1000
%d -200
*/
#include<stdio.h>
int main(int argc, char const *argv[])
{
unsigned int b = -100;
printf("%d\t%u\t%x\n", b, b, b);
printf("%d\t%d\n", b >> 1, b << 1);
return 0;
}
结果输出:
-100 4294967196 ffffff9c
2147483598 -200
~x + x = -1
一个数取反,加上他本身等于-1