铸造什么时候更改C中的值?

我有一个C unsigned int,实际上是存储一个有符号的值。我想将此变量转换为带符号的int,以使无符号和带符号的值具有相同的二进制值。

unsigned int lUnsigned = 0x80000001;
int lSigned1 = (int)lUnsigned;                   // Does lSigned == 0x80000001?
int lSigned2 = static_cast<int>(lUnsigned);      // Does lSigned == 0x80000001?
int lSigned3 = reinterpret_cast<int>(lUnsigned); // Compiler didn't like this

什么时候改变C中的变量的位?例如,我知道从int到float的转换将改变位,因为int是二进制补码,float是浮点数。但是其他情况呢?我不清楚C的规则。

在C99规范的6.3.1.3节中,它表示从无符号到有符号整数的转换是编译器定义的!

类型转换可以

>保持概念值(位模式可能需要更改)或
保持位模式(概念值可能需要更改)。

保证始终保持bitpattern的唯一C cast是const_cast。

如其名字所示,reinterpret_cast旨在保持bitpattern并简单地重新解释它。但是标准允许实现在如何实现reinterpret_cast方面有很大的余地。在某些情况下,reinterpret_cast可能会更改位模式。

dynamic_cast通常会改变位模式和值,因为它通常会深入到一个对象中并返回一个对所请求类型的子对象的指针/引用。

static_cast可能会改变整数和指针的bitpattern,但是几乎所有的现有计算机都使用带符号整数(称为二进制补码)的表示,其中static_cast不会更改位模式。关于指针,就足够说,例如,当一个基类是非多态的并且一个派生类是多态的时候,使用static_cast从指针到派生到指向base的指针,反之亦然,可能会改变位模式你可以看到比较void *指针时)。现在,整数…

对于n个值位,无符号整数类型具有2 ^ n个值,范围为0到2 ^ n-1(含)。

C标准保证通过添加或减去2 ^ n的合适倍数,将类型的任何结果包裹在该范围内。

其实这就是C标准的描述。 C标准只是说操作是模2 ^ n,这意味着相同。

使用二进制补码形式,带符号值-x与无符号值-x 2 ^ n具有相同的位模式。也就是说,与C标准相同的位模式保证通过将-x转换为相同大小的无符号类型来获得。这是两个补充形式的简单基础,正是您正在寻求的保证。 🙂

几乎所有现存的计算机都使用二进制补码。

因此,在实践中,保证您的示例不变的位图。

http://stackoverflow.com/questions/4218465/when-does-casting-change-a-values-bits-in-c

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:铸造什么时候更改C中的值?