char 相关
1. signed char(有符号 char)
范围:-128 到 127
溢出按补码循环
(signed char)128→ -128(signed char)-129→ 127
它们是钟形循环的
✅原理:1 字节 8 位补码,超过上限 / 下限直接截断循环。
char a; printf("%u",a);
这里会发生整数提升,a 先转 int,再按无符号打印;a 本身的值仍在 - 128~127。
2. 无符号类型 unsigned
unsigned int i:i 永远≥0;i >= 0永远为真。unsigned char i:范围{0 到255};i <=255恒成立。
⚠️经典坑:for(unsigned i=5; i>=0; i--) 死循环,i 永远不会小于 0。它减到-1,其实是255.
3. strlen + char 数组溢出
strlen:统计\0(ASCII=0)之前的字符个数,遇到\0立刻停止
例子:
char a[1000];
for(int i=0; i<1000; i++){
a[i] = -1 - i;
}
strlen(a);
循环赋值,直到某个`-1-i == 0`,此时`a[i] = '\0'`,strlen 在这里截断。
实际就是找到整数为0
### 4. char 与 ASCII
✅`char`本质是 1 字节整数;**可打印 ASCII:0~127**
- `'\0'` ASCII 值 = 0
- `'A'` ASCII 值 = 65
---
## int、float 内存存储(二进制补码 / IEEE754)
### 1. int(32 位)写入内存规则
1. 数字转**补码**,补齐到 32 位存入内存
- signed int:最高位符号位
- 符号位 = 0:正数,高位补 0
- 符号位 = 1:负数,高位补 1
- unsigned int:无符号,全部是数值位,高位统一补 0
### 2. float 32 位 IEEE754 标准
32 位分为三段:
表格
| 1bit S 符号位 | 8bit E 阶码 | 23bit M 尾数 |
| --- | --- | --- |
前1中8后23
公式:
(V=(-1)^S (1.M)_2 * 2^{E-127}\)
//^这个是次方的意思
- S=0 →正数;S=1→负数
- \(1.M\):隐藏整数 1,尾数 M 只保存小数点后面二进制
- 阶码偏移量:**E = 真实指数 + 127**
例子 9.0
1. \(9.0 = 1.001 \times 2^3\)
2. S=0;真实指数 = 3;E=3+127=130
3. M = 001 后面补 0 填满 23 位
4. 最终二进制:`0 | 10000010 | 00100000000000000000000`
##坑点总结
1. 有符号 char 溢出:**循环回卷**;无符号永远≥0,容易写出死循环
2. strlen 只认`\0`,数组越界访问风险
3. float 是**二进制科学计数法**,存在精度丢失(0.1 存不精确)
4. 有符号 / 无符号混合运算,全部转为无符号计算,极易踩坑
1万+



被折叠的 条评论
为什么被折叠?



