Windows下PostgreSQL主从流复制实战指南
2026/10/15 7:46:32
#include<stdio.h>intmain(){shortnum=0x7FFF;printf("%hd \r\n",num);num=0x8000;printf("%hd \r\n",num);return0;}shortnum=32767;num++;// 32767 +1,二进制进位,最高位变成1printf("%hd",num);// 输出 -32768● 汇编:movsx eax, word ptr [num]
● movsx:符号位扩展,把 16 位 short 扩展到 32 位 eax
● 最高位是 1,代表负数;最高位 0 代表正数
⚠️重点:C 标准里有符号整数溢出是 UB(未定义行为),只是在 VC/VS 编译器下会按补码回绕,不同编译器 / 优化等级结果可能不一样
#include<stdio.h>intmain(){unsignedintnum=4294967295;printf("%u \r\n",num);num++;printf("%u \r\n",num);return0;}mov dword ptr[num],0FFFFFFFFh;给num赋值0xFFFFFFFFmov eax,dword ptr[num]push eax push offset string"%u \r\n"call _printf add esp,8mov eax,dword ptr[num]add eax,1;eax=eax+1mov dword ptr[num],eax;写回栈,超出32bit的进位直接丢弃● add eax,1 加法指令本身会产生进位标志 CF,但存储到 32 位变量时,超出的进位不会保存,直接截断
| 类型 | 字节 | 溢出行为 | C 标准规定 |
|---|---|---|---|
| signed short | 2 | 32767+1 → -32768 | 未定义行为 UB,仅 VC 下补码回绕 |
| unsigned int | 4 | 4294967295+1 → 0 | 确定,模2^32截断 |