3

我正在处理的代码有很多从uint8to进行的转换char,然后 C 库函数在这些转换上被调用。我试图理解为什么作者更喜欢uint8这个char。例如:

uint8 *my_string = "XYZ";
strlen((char*)my_string);

会发生什么\0,它是在我投射时添加的吗?

当我反过来施法时会发生什么?

这是一种合法的工作方式吗,为什么有人更愿意与uint8over合作char

4

1 回答 1

9

演员阵容char <=> uint8很好。始终允许将任何已定义的内存作为无符号字符访问,包括字符串文字,然后当然可以将指向字符串文字的指针转换回char *.

uint8 *my_string = "XYZ";

"XYZ"是 4 chars 的匿名数组 - 包括终止零。这衰减为指向第一个字符的指针。然后将其隐式转换为uint8 *- 严格来说,它应该具有显式转换。


类型的问题char在于标准将其留给实现来定义它是有符号的还是无符号的。如果字符/字节有很多算术,默认情况下将它们无符号可能会有所帮助。

一个特别臭名昭著的例子是<ctype.h>它的is*字符类函数 -isspace等等isalpha。他们要求字符为unsigned chars(转换为 int)!一段相当于 的代码char c = something(); if (isspace(c)) { ... }是不可移植的,编译器甚至无法对此发出警告!如果char类型是在平台上签名的(默认在 x86 上!)并且字符不是 ASCII(或者更准确地说,是基本执行字符集的成员),那么行为是未定义的 -它甚至会在 MSVC 调试中中止构建,但不幸的是只会导致 glibc 上的静默未定义行为(数组访问越界)。

但是,编译器会非常大声地使用unsigned char *或其别名作为 的参数strlen,因此会进行强制转换。

于 2018-07-08T07:57:17.510 回答