将uint8_t转换为signed int至少有时是不正确的吗?

led*_*ter 1 c++ int unsigned casting

在阅读以下问题的答案时

以十六进制表示形式获取缓冲区到字符串流:

我不明白为什么有要投uint8_tunsigned(或写在评论,甚至unsigned char在这之前),而铸造只是int不正确.

据我所知,没有任何转换会导致解释uint8_t成为一种基础类型,它可以(必须)成为3种char变体中的一些,从而将其作为一个字符打印出来.

但是施法有什么不对int?任何uint8_t值都应该始终适合int,因此转换似乎很简单.为什么sign-extension会使代码不正确(在评论中提到)?

UPD:

仅供参考,我想在我提到的问题中谈到的是一个案例signed char:

signed char num = -1;
std::cout << std::hex << static_cast<unsigned int>(static_cast<unsigned char>(num));
Run Code Online (Sandbox Code Playgroud)

如果f没有第二次演员,这将写成超过2 秒.

关于2的补码系统的观点似乎是不正确的,因为积分转换应该适用于将-1转换为unsigned <smth>,并且它遵循2的补数系统(即,当转换为例如uint8_t结果应该始终为255并因此被打印为0xff,甚至有不同的位模式).

小智 5

你是正确的铸造uint8_tint会产生完全相同的值作为铸造uint8_tunsigned int.测试uint8_t0 ... 255的所有可能值的简单循环将确认生成的字符串是100%相同的,并且假设所有实现必须支持int甚至高于255的值,那么在某些模糊实现的情况下不可能有限范围int可能会导致问题.