如何根据位将有符号整数值转换为无符号整数值
How to turn a signed integer value to unsigned, according to its bits?
我想把一个有符号的值变成一个无符号的值(例如,int8_t
到uint8_t
),但它也必须保留它的位。
我该怎么做?
在实践中:您可以简单地将带符号的值分配给uint8_t
,
u = i;
或者你可以用带符号的值初始化它
uint8_t u = i;
这假设了二的补码有符号整数表示,这在今天是普遍使用的。通过该表示,比特被精确地保留。“在实践中";资格是指这种假设。
例如,在现代机器上,例如−42的8位有符号表示是位模式号−42+256,即(位模式号)214。标准保证将其转换为无符号,以产生相同的模256值。所以它是相同的位模式,即位模式214。
从有符号到无符号是标准定义的,尽管比特模式(1)的保留通常只是一种实际效果(所有现代计算机都是这样设计的)。但是,如果无法表示无符号值,则相反的方向会遇到编译器特定的效果。这种转换需要更加小心,因为这是编译器的自由裁量权问题,而不是硬件级别的实际保证。
(1) 正如M.M.在他的回答中所解释的那样,你的例子中的特定有符号类型int8_t
是一种,因为C11在C中保证了2的补码。我在C99标准的最终草案中没有看到这种语言,所以它可能不在C99中,因此也不在基于C99的C++11或C++14中,但可能在基于C11的C++17中。
使用intN_t
类型,您可以简单地编写:
int8_t i = something;
uint8_t u = i;
因为这些类型需要使用2的补码表示,其中定义此转换是为了保留位。
参考:C++14[cstulpt.syn]/2:
标题定义了所有功能、类型和宏,与C标准中的7.18相同
和C11 7.20.1.1/1(C99 7.18.1.1):
typedef名称
intN_t
指定一个带符号整数类型,宽度为N
,没有填充位,表示为2的补码。
要保留其他整数类型的表示,请使用:
int i = something;
unsigned int i = *(unsigned int *)&i;
您可以对任何一对相应的有符号和无符号类型执行此操作。除了生成陷阱表示的可能性之外,它是安全的。
尝试显式类型转换。使用static_cast的(不安全的)类型转换对于获取变量的"原始字节"是必要的。要将的值转换为给定的类型,您可以编写以下内容:
static_cast<type_to_convert_to>(expression)
使用static_cast,在编译时静态检查cast。
#include <iostream>
int main() {
int8_t i {11};
uint8_t i2 = static_cast<uint8_t>(i);
std::cout << "i occupies " << sizeof(i) << " bytes." << std::endl;
std::cout << "i2 occupies " << sizeof(i2) << " bytes." << std::endl;
}
- 努力将整数转换为链表。不知道我在这里做错了什么
- 如何在C++中将整数转换为其数字数组
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 将最小值整数转换为无符号长整型
- 为什么我们不能将使用异或运算找到的整数转换为字符?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将74位整数转换为以31为底的整数
- 独立于实现的浮点/整数转换
- 以最少的步骤将给定整数转换为另一个整数
- 浮点到整数转换出错(即使浮点数已经是整数)
- 了解双精度转换与整数转换中的整数与截断关系
- 禁止具有精度损失的整数转换
- 将任意整数转换为 void*
- 将 32 位大端有符号整数转换为有符号小端整数
- char a[0] 使用 itoa() 将整数转换为字符串的目的
- 使用函数时从整数转换为字符串
- 尝试从整数转换为字符串的月份
- 如何在C++中将整数转换为字节,以便 Unity 在通过 UDP 传输后能够理解它们
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 如何避免字符串到整数转换情况下的无效参数异常