无符号到有符号的转换,在位级别会发生什么
unsigned to signed conversion, what happens at the bit level?
可能的重复项:
当二元运算符两端的符号不同时,提升规则如何工作?
当从 unsigned
整数转换为 signed
整数时,我知道变量位的表示形式会发生变化。 例如,当从 uint8
转换为 int8
时,255 可能会变为 -1。 但是,我从来不确定"转换"或"转换"对底层位本身意味着什么。
我的问题是,整数变量的原始位模式是否保证在有符号和无符号类型之间static_cast
后保持不变,或者是否有可能以某种方式被强制转换?
出于好奇,整数标牌类型之间的static_cast
是生成汇编,还是仅用于编译器知道要生成哪些 asm 指令?
编辑:
下面是我想知道的场景类型的示例:
unsigned int uintvar = random();
unsigned int control = uintvar;
assert(control == static_cast<unsigned int>(static_cast<signed int>(uintvar)));
忽略双播会被优化的事实,这个例子能保证永远成立吗?
位模式根本不会改变(在大多数架构上,您可能会在实践中遇到)。区别在于编译器生成的用于操作值的指令。
如果无符号值太大而无法放入有符号对应项,则它是未定义的行为。
255 变成 -1,因为这些位是 -1 的赞美。位什么也没发生。
相关文章:
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- C++ C4244 =':从"std::streamsize"转换为"无符号短",可能会丢失数据;有什么解决办法吗?
- 符号":" C 和 C++ 中是什么意思?
- 无符号长整型和无符号 int 之间有什么区别,这 2 种类型应该如何在 c# 中封送?
- 这种错误的原因是什么:将"功能"重新定义为不同类型的符号
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 代码输出随机符号,我不确定出了什么问题
- 什么是 16 字节有符号整数数据类型?
- 计算机使用什么方法添加无符号整数
- dynamic_cast什么时候会因为隐藏符号而失败?
- 这个星号 (*) 符号在 C++ 中是什么意思?-- 指向成员的指针
- 指针符号在参数规范中表示什么,例如:(char16 *缓冲区,int32 大小)?C++
- & 符号在这里做什么?
- 在平等符号左侧使用RVALUE参考的规则是什么?
- 根据浮点符号对浮点进行舍入的最简单方法是什么
- 在这段 python 代码中,大于符号是什么意思
- “*(无符号整数*)((无符号整数)块 + n*i)”是什么意思
- 通过无符号 char 别名进行对象访问,加载和存储时会发生什么?
- 在矢量的尖括号内使用指针符号与在外部使用指针符号有什么区别