如何将无符号数转换为uint64_t?

3

我有一个unsigned,想要将其转换为uint64_t(如果可能的话还可以反向转换)。

我该怎么做?如果可能的话,我想避免依赖未定义的行为。

谢谢!

4个回答

6

从任何整数类型转换为无符号整数类型的转换完全由标准定义(第6.3.1.3节,第2段)。如果该值可以用目标类型表示,则保留该值; 否则,该值被模2^WIDTH减少,其中WIDTH是目标类型的宽度(值位数)。


3
例如:
const uint64_t bigvalue = (uint64_t) 42u;

不确定是否需要转换,因为这不会丢失信息。相反:

const unsigned int smallvalue = (unsigned int) bigvalue;

需要进行强制类型转换,因为它(假设int < uint64_t)是一个更窄的类型。

注意:我指的是“需要”一个弱的意义上;由于将更宽的类型转换为更窄的类型时有失去信息的风险,编译器通常会发出警告。进行强制类型转换可以表明“我知道自己在做什么”,这通常是消除此类警告的方式。


2
不需要强制转换,永远不需要,在无符号类型之间的转换总是明确定义的。 - Jens Gustedt

0
你可以使用类型转换来完成: uint64_t new = (uint64_t) old; 这里的old是你的无符号整数。

-1

既然你在C语言领域,强制转换是你唯一的方式。只需

uint64_t foo = (uint64_t)myVar;

或者,反过来

unsigned int bar = (unsigned int)foo;

你的编译器应该自动进行转换,但是在 uint64_t -> unsigned int 的情况下,你应该会收到有关截断的警告。此外,在转换回来时,除非你在 64 位环境中编译,否则值当然会被截断。


1
在这里不应该需要使用强制类型转换,通常情况下应尽可能避免使用。 - Jens Gustedt
@JensGustedt - 我原以为楼主已经尝试过那个方法了,所以建议使用强制类型转换和我的最后一段话。不过你说得很对,除非真的有必要,否则不应该进行类型转换。 - slugonamission

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接