无符号长和位移位
Unsigned long and bit shifting
本文关键字:无符号 更新时间:2023-10-16
我有一个位移位和无符号长整型的问题。这是我的测试代码:
char header[4];
header[0] = 0x80;
header[1] = 0x00;
header[2] = 0x00;
header[3] = 0x00;
unsigned long l1 = 0x80000000UL;
unsigned long l2 = ((unsigned long) header[0] << 24) + ((unsigned long) header[1] << 16) + ((unsigned long) header[2] << 8) + (unsigned long) header[3];
cout << l1 << endl;
cout << l2 << endl;
我希望 l2 的值也为 2147483648,但它打印18446744071562067968。我假设第一个字节的位移会导致问题?
希望有人可以解释为什么这会失败以及我如何修改 l2 的计算以使其返回正确的值。
提前谢谢。
存储在字符中的0x80值是有符号数量。将其转换为更宽的类型时,将对值进行签名扩展,以保持与较大类型相同的值。
将第一行中的char
类型更改为unsigned char
,您将不会获得符号扩展。
要简化您的案例中发生的情况,请运行以下命令:
char c = 0x80
unsigned long l = c
cout << l << endl;
你会得到这个输出:
18446744073709551488
它是 -128 作为 64 位整数(0x80是 -128 作为 8 位整数)。
相同的结果在这里(Linux/x86-64,GCC 4.4.5)。行为取决于 unsigned long
的大小,至少为 32 位,但可能会更大。
如果你想要正好 32 位,请使用 uint32_t
代替(从标头<stdint.h>
;不是在 C++03 中,而是在即将推出的标准中得到广泛支持)。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 将无符号char*转换为std::istream*C++
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 获取隐式转换溢出从无符号到已签名的警告
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 无法在 Arduino 中uint8_t数组转换为无符号长整型数组
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- C4018:类内有符号、无符号不匹配
- C++无符号短裤的划分导致 int
- 库特无符号字符