我有一个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 位环境中编译,否则在转换回时该值当然会被截断。