在阅读的回答以下问题铸造uint8_t至少有时不正确吗?
Getting a buffer into a stringstream in hex representation:
我不明白为什么有必要投uint8_t
到unsigned
(或写在评论,甚至unsigned char
之前),而铸造只是为了int
是不正确的。
据我所知,根本没有任何转换会导致将uint8_t
解释为一种基本类型,它可以(必须是)变体的一部分,从而将其打印为字符。
但是铸造到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));
这将被写为超过2 f
在没有第二次演员的情况下。
点约2的补体系统似乎是不正确的,虽然,作为一个整体转换应适用于转换-1到unsigned <smth>
,并且它遵循2的补数系统(即转换为例如uint8_t
当结果应始终是255并因此被打印为0xff
,甚至具有不同的位模式)。
你是说在指针类型之间进行转换还是在这些类型的值之间进行转换? –
如果缓冲区的类型可能是'char'(或其他非'unsigned'类型),答案和注释可能只是防御性的。您可以安全地将'uint8_t'转换为'int'而不会出现符号扩展问题。 – Cornstalks
@FrançoisAndrieux在这些类型的值之间进行转换(就像我在上面提到的问题的答案中所做的那样,即从'uint8_t'到'int'('unsigned')的转换) – ledonter