我有一个unsigned
,想要将其转换为uint64_t
(如果可能的话还可以反向转换)。
我该怎么做?如果可能的话,我想避免依赖未定义的行为。
谢谢!
从任何整数类型转换为无符号整数类型的转换完全由标准定义(第6.3.1.3节,第2段)。如果该值可以用目标类型表示,则保留该值; 否则,该值被模2^WIDTH
减少,其中WIDTH
是目标类型的宽度(值位数)。
const uint64_t bigvalue = (uint64_t) 42u;
不确定是否需要转换,因为这不会丢失信息。相反:
const unsigned int smallvalue = (unsigned int) bigvalue;
需要进行强制类型转换,因为它(假设int
< uint64_t
)是一个更窄的类型。
注意:我指的是“需要”一个弱的意义上;由于将更宽的类型转换为更窄的类型时有失去信息的风险,编译器通常会发出警告。进行强制类型转换可以表明“我知道自己在做什么”,这通常是消除此类警告的方式。
uint64_t new = (uint64_t) old;
这里的old
是你的无符号整数。既然你在C语言领域,强制转换是你唯一的方式。只需
uint64_t foo = (uint64_t)myVar;
或者,反过来
unsigned int bar = (unsigned int)foo;
你的编译器应该自动进行转换,但是在 uint64_t
-> unsigned int
的情况下,你应该会收到有关截断的警告。此外,在转换回来时,除非你在 64 位环境中编译,否则值当然会被截断。