C++ 无符号到有符号的转换,在位级别会发生什么?

C++ 无符号到有符号的转换,在位级别会发生什么?,c++,integer,bit-manipulation,C++,Integer,Bit Manipulation,可能重复: 当从无符号整数转换为有符号整数时,我知道变量位的表示会发生变化。例如,从uint8转换为int8时,255可能变成-1。然而,我从来都不知道底层比特本身的“转换”或“转换”意味着什么 我的问题是,整数变量的原始位模式是否保证在有符号和无符号类型之间进行静态转换后保持不变,或者是否可能通过转换以某种方式进行转换 出于好奇,整型标牌类型之间的静态\u cast是否会生成程序集,或者它的使用只是为了让编译器知道要生成什么asm指令 编辑: 下面是一个我想了解的场景示例: unsigned

可能重复:

当从
无符号
整数转换为
有符号
整数时,我知道变量位的表示会发生变化。例如,从
uint8
转换为
int8
时,255可能变成-1。然而,我从来都不知道底层比特本身的“转换”或“转换”意味着什么

我的问题是,整数变量的原始位模式是否保证在有符号和无符号类型之间进行
静态转换后保持不变,或者是否可能通过转换以某种方式进行转换

出于好奇,整型标牌类型之间的
静态\u cast
是否会生成程序集,或者它的使用只是为了让编译器知道要生成什么asm指令

编辑:

下面是一个我想了解的场景示例:

unsigned int uintvar = random();
unsigned int control = uintvar;
assert(control == static_cast<unsigned int>(static_cast<signed int>(uintvar)));
unsigned int uintvar=random();
无符号整数控制=uintvar;
断言(control==static_cast(static_cast(uintvar));

忽略双重强制转换将得到优化的事实,这个示例是否可以保证始终保持正确?

位模式根本不会改变(在实践中可能遇到的大多数体系结构上)。不同之处在于编译器生成的用于操作值的指令。

如果无符号值太大,无法放入有符号的对应值中,则这是未定义的行为


255变为-1,因为在2的恭维中这些位是-1。位不会发生任何变化。

事实上,没有任何变化。好吧,如果有符号整数的表示不是2的补码,并且您将负值转换为无符号类型,那么位模式实际上会发生变化。@DanielFischer dammit Daniel,我的评论投票数还有两个小时没有了=(+1)。我得到了一些混合信号,啊哈。有什么我可以补充的来澄清这个问题吗?透视仪-如果比特表示是二的恭维,没有什么变化。我不知道有哪一个甚至远的主流系统不使用二的恭维,但它不是标准规定的,所以DanielFischer的答案是ge最重要的是它可能会改变。