c - 在 C89 中通过直接计算确定 char 的范围(不要使用 limits.h)

标签 c char

我正在尝试解决 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/

相关文章:

c - 将在数字数组中查找素数的函数

c++ - 如何在 C 中找到 "char *"数组的长度?

将 int(32 位)转换为 char(8 位)

c - (char) 在 ((unsigned char) ~0 >> 1) 之前的作用是什么?

c - C (linux) 中的线程

c - 非动态数组何时在结构中释放

c - times() 系统调用。返回值溢出

java - 字符数组(Java)中空单元格的值是多少?

C++ 测试\n

C: 函数结束后丢失 char** 的内容