你的知识在微妙的方面是不完整的:
我的编译器的 unsigned char 包含 1 个字节。
类型unsigned char根据定义对于所有编译器来说正好是一个字节。
据我所知,无符号字符的范围是从 0 到 2^8 - 1,即 255。
不完全是:unsigned char 的 最小 值位数是 8,并且此类型不允许填充位,这意味着 最小 大小byte 是 8 位。事实上,现在大多数架构都标准化为 8 位字节,但 C 标准允许其他更大的位宽,并且一些微控制器使用 16 位字节(甚至 32 位字节)。在此类处理器上,unsigned char 为 16 位(甚至 32 位)。
现在我想确认unsigned char可以显示的最大整数是255。
这是一个真正的问题,可以在编译时和运行时验证。
以下是我的代码:
#include <stdio.h>
#include <limits.h>
包含<limits.h> 是一个好方法:UCHAR_MAX 是您想要打印甚至直接在预处理指令中测试的值。
int main(void) {
printf("unsigned char has %d bytes.\n", sizeof(unsigned char));
未定义的行为:%d 需要 int 类型的参数,这与 size_t 类型的 sizeof(unsigned char) 不同并且可能不兼容。使用%zu 或将参数转换为(int)sizeof(unsigned char)。但请注意,sizeof(unsigned char) 根据定义 始终计算为 1,类型为 size_t。
unsigned char a;
a = 0;
printf("%d\n", a - 1);
a - 1 的计算结果始终为 -1,因为 a 被提升为 int 并且 0 - 1 的值为 -1。你想打印(unsigned char)(a - 1),或者只是(unsigned char)-1。
printf("%u\n", a - 1);
这将打印(unsigned int)-1 的值,即UINT_MAX,而不是UCHAR_MAX。
printf("%lu\n", a - 1);
printf("%llu\n", a - 1);
printf("%zu\n", a - 1);
上面的 3 个 printf 调用具有潜在的未定义行为,因为您为一个参数传递了一个 int 值,该参数的预期字节分别为 unsigned long、unsigned long long 和 size_t。
return 0;
}
这是一个更简单的方法:
#include <stdio.h>
#include <limits.h>
int main() {
printf("UCHAR_MAX = %u\n", UCHAR_MAX);
printf("(unsigned char)-1 = %u\n", (unsigned char)-1);
printf("-1 with %%hhu conversion: %hhu\n", -1);
return 0;
}
输出:
UCHAR_MAX = 255
(unsigned char)-1 = 255
-1 with %hhu conversion: 255