文件
JGZ_YES 83fe7bfb83 Initial commit: PazeE Language Alpha-0.1
PazeE 编译器(.NET 8/C# 实现),直接生成原生 x64/ARM64 机器码,无需 gcc/clang/nasm。

主要特性:
- 词法/语法/语义分析、AST 生成、代码生成
- 目标平台:Windows (PE32+)、Linux (ELF64)、macOS (Mach-O 64)、Los4
- 架构:AMD64 与 ARM64 独立后端
- C 语法特性:匿名结构体/联合、位域、灵活数组成员、语句表达式+typeof
- printf 颜色格式化、time.get.utc 时区支持
- GUI 支持:Windows (Win11 API)、Los4、Linux (X11)、macOS (ObjC)
- Windows GUI 程序无控制台窗口(PE 子系统自动检测)
- WiX Bundle 安装器(仅输出 .exe,MSI 作为中间产物内嵌)
2026-08-02 16:29:31 +08:00

67 行
1.9 KiB
Plaintext

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
// bitfield.pe — 位域 bit-field 测试
// 验证位域的打包布局、读写、跨字节位域、符号扩展与零宽对齐
struct Flags {
unsigned a : 4; // 0..3 位
unsigned b : 4; // 4..7 位(与 a 共享同一字节)
unsigned c : 8; // 8..15 位(独立字节)
unsigned d : 16; // 16..31 位(跨字节)
int e : 5; // 32..36 位,有符号位域(-16..15
int f : 0; // 零宽:强制后续从下一个存储单元对齐
unsigned g : 3; // 新的 32 位单元起始
};
struct Packed {
unsigned bit0 : 1;
unsigned bit1 : 1;
unsigned bit2 : 1;
unsigned bit3 : 1;
unsigned rest : 4;
};
int main(void)
{
// 1. 位域赋值与读取
struct Flags fl;
fl.a = 0xF; // 4 位最大
fl.b = 0xA;
fl.c = 0x5A;
fl.d = 0xBEEF;
fl.e = -7; // 有符号位域
fl.g = 5;
printf("a=%u b=%u c=%u d=%u\n", fl.a, fl.b, fl.c, fl.d);
printf("e=%d g=%u\n", fl.e, fl.g);
printf("sizeof(Flags)=%d\n", sizeof(struct Flags));
// 2. 修改单个位域不影响其它位域
fl.a = 3;
fl.b = 12;
fl.c = 200;
fl.d = 1;
printf("after mod: a=%u b=%u c=%u d=%u e=%d g=%u\n",
fl.a, fl.b, fl.c, fl.d, fl.e, fl.g);
// 3. 单位 packed 测试
struct Packed p;
p.bit0 = 1;
p.bit1 = 0;
p.bit2 = 1;
p.bit3 = 1;
p.rest = 10;
printf("bits: %u%u%u%u rest=%u\n", p.bit0, p.bit1, p.bit2, p.bit3, p.rest);
printf("sizeof(Packed)=%d\n", sizeof(struct Packed));
// 4. 位域溢出截断
p.rest = 0xFF; // 4 位只能存低 4 位
printf("overflow rest=%u (expect 15)\n", p.rest);
// 5. 有符号位域符号扩展
fl.e = 15; // 最大正数
printf("e=15 -> %d\n", fl.e);
fl.e = 16; // 溢出 -> -16
printf("e=16 -> %d (expect -16)\n", fl.e);
return 0;
}