
short 强制转 int 会不会丢数据?
不会。int 范围远大于 short(通常 -32768~32767 → -2147483648~2147483647),static_cast<int>(x)</int> 或隐式转换都安全,值完全保留。
short 转 unsigned short 溢出时行为是什么?
负的 short 转 unsigned short 是**未定义行为(UB)**,但实际编译器普遍按模运算处理:
-3 → USHRT_MAX - 2(即 65533)
常见错误现象:short x = -1; unsigned short y = x; 得到 65535,而非预期的 0 或报错
- 必须先检查符号:
if (x
- 或用
std::bit_cast(C++20)明确意图,但需确保目标类型能容纳位模式
- 不要依赖“看起来正常”的结果——UB 可能在优化后崩坏
char 到 short 的截断风险在哪?char 有 signed/unsigned 两种实现,且大小不保证是 1 字节(虽几乎总是),但关键问题是:
char c = '\xff'; short s = c;
若 char 是 signed,则 c 是 -1,s 得 -1(正确);
若 char 是 unsigned,则 c 是 255,s 得 255(也正确)。
表面没丢,但语义已模糊:你本意是读字节还是读有符号数?
明确用 signed char 或 unsigned char 替代裸 char
二进制 I/O 场景下,优先用 std::byte(C++17)或 uint8_t
避免 short s = some_char_array[i]; 这类隐式提升,加注释说明符号假设
memcpy 把 int 写进 short 数组会怎样?
直接越界写入,触发**未定义行为**,不是“截断”,而是踩内存:
int val = 0x12345678;
short arr[2];
memcpy(arr, &val, sizeof(val)); // 错!写 4 字节进 4 字节空间?arr 只有 4 字节,但对齐和别名规则仍可能崩
-
memcpy 不做类型检查,只管字节搬运
- 即使目标空间够大,
int 和 short 的别名规则(strict aliasing)会让编译器优化出错
- 正确做法:逐元素赋值 + 显式截断检查,或用
std::bit_cast(仅当 size 相等且 trivially copyable)
- 调试时
-fsanitize=undefined 会立刻捕获这类问题
short 转 unsigned short 是**未定义行为(UB)**,但实际编译器普遍按模运算处理:
-3 → USHRT_MAX - 2(即 65533)
常见错误现象:short x = -1; unsigned short y = x; 得到 65535,而非预期的 0 或报错
- 必须先检查符号:
if (x - 或用
std::bit_cast(C++20)明确意图,但需确保目标类型能容纳位模式 - 不要依赖“看起来正常”的结果——UB 可能在优化后崩坏
char 到 short 的截断风险在哪?char 有 signed/unsigned 两种实现,且大小不保证是 1 字节(虽几乎总是),但关键问题是:
char c = '\xff'; short s = c;
若 char 是 signed,则 c 是 -1,s 得 -1(正确);
若 char 是 unsigned,则 c 是 255,s 得 255(也正确)。
表面没丢,但语义已模糊:你本意是读字节还是读有符号数?
明确用 signed char 或 unsigned char 替代裸 char
二进制 I/O 场景下,优先用 std::byte(C++17)或 uint8_t
避免 short s = some_char_array[i]; 这类隐式提升,加注释说明符号假设
memcpy 把 int 写进 short 数组会怎样?
直接越界写入,触发**未定义行为**,不是“截断”,而是踩内存:
int val = 0x12345678;
short arr[2];
memcpy(arr, &val, sizeof(val)); // 错!写 4 字节进 4 字节空间?arr 只有 4 字节,但对齐和别名规则仍可能崩
-
memcpy 不做类型检查,只管字节搬运
- 即使目标空间够大,
int 和 short 的别名规则(strict aliasing)会让编译器优化出错
- 正确做法:逐元素赋值 + 显式截断检查,或用
std::bit_cast(仅当 size 相等且 trivially copyable)
- 调试时
-fsanitize=undefined 会立刻捕获这类问题
char c = '\xff'; short s = c;
若 char 是 signed,则 c 是 -1,s 得 -1(正确);
若 char 是 unsigned,则 c 是 255,s 得 255(也正确)。
表面没丢,但语义已模糊:你本意是读字节还是读有符号数?
明确用 signed char 或 unsigned char 替代裸 char
二进制 I/O 场景下,优先用 std::byte(C++17)或 uint8_t
避免 short s = some_char_array[i]; 这类隐式提升,加注释说明符号假设
int val = 0x12345678; short arr[2]; memcpy(arr, &val, sizeof(val)); // 错!写 4 字节进 4 字节空间?arr 只有 4 字节,但对齐和别名规则仍可能崩
-
memcpy不做类型检查,只管字节搬运 - 即使目标空间够大,
int和short的别名规则(strict aliasing)会让编译器优化出错 - 正确做法:逐元素赋值 + 显式截断检查,或用
std::bit_cast(仅当 size 相等且 trivially copyable) - 调试时
-fsanitize=undefined会立刻捕获这类问题
强制类型转换本身不危险,危险的是把“我懒得想范围”当成“它应该没问题”。short 的边界太窄,稍不注意,溢出就发生在赋值号右边,连 warning 都不报。
立即学习“C++免费学习笔记(深入)”;










