我正在尝试解决 K&R 的 C 书的 Ex 2-1。该练习要求通过直接计算(而不是直接从 limits.h
打印值)来确定 char 的范围。关于如何很好地完成这项工作有什么想法吗?
最佳答案
好的,我把我的版本扔进戒指:
unsigned char uchar_max = (unsigned char)~0;
// min is 0, of course
signed char schar_min = (signed char)(uchar_max & ~(uchar_max >> 1));
signed char schar_max = (signed char)(0 - (schar_min + 1));
它确实假定有符号的 2 的补码和有符号和无符号字符的相同大小。虽然我只是定义了前者,但我确信可以从标准中推断出后者,因为两者都是 char 并且必须保存“执行字符集”的所有编码(这对像 UTF-8 这样的 RL 编码字符集意味着什么) .
从中得到 1 的补码和 sing/magnitude-version 是直截了当的。请注意,未签名的版本始终相同。
一个优点是它完全以 char
类型运行并且没有循环等。因此它在 8 位架构上仍然具有高性能。
嗯……我真的认为这需要一个循环来签名。我错过了什么?
关于c - 在 C89 中通过直接计算确定 char 的范围(不要使用 limits.h),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30315209/