C 是否提供了运算符来检查类型的符号性?

nat*_*evw 6 c unsigned signed casting typedef

如果我使用的库当前使用特定的数字类型别名,例如

\n\n
typedef uint32_t library_type;\n\nvoid library_function(library_type x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

即使库更改了其 typedef,我如何确保需要传入不同类型的值的代码保持正确?

\n\n
uint64_t x = get_some_number();\n\n// \xe2\x80\xa6need checks here\xe2\x80\xa6\n\nlibrary_function((library_type)x);\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以添加以下检查:

\n\n
assert(sizeof library_type >= sizeof uint32_t);\nassert(x <= UINT32_MAX);\n
Run Code Online (Sandbox Code Playgroud)\n\n

第二次检查将确保我得到的值符合当前 的范围library_type。库作者没有提供LIBRARY_TYPE_MAX定义,因此第一个检查试图保护第二个,以防万一library_type将来编译代码时因任何原因发生更改。

\n\n

第一次检查会捕获 if library_typewere 更改为 eg int8_t,但如果 thelibrary_type更改为 anint32_t该怎么办?它仍然是正确的“尺寸”,但范围仍然小于我正在检查的范围!

\n\n

C 语言是否提供了一个运算符来内省类型的符号性,就像sizeof让我知道宽度一样?有没有其他方法可以确保library_type只有在正确的情况下才能达到我的演员表?

\n

R..*_*R.. 7

是的,关系运算符与强制转换运算符相结合。例如:

_Bool TYPE_is_signed = ((TYPE)-1 < 0);
Run Code Online (Sandbox Code Playgroud)

或者作为断言:

assert((TYPE)-1 < 0); // Require that TYPE is signed
assert((TYPE)-1 > 0); // Require that TYPE is unsigned
Run Code Online (Sandbox Code Playgroud)