user-0 提问: int类型-1 转换为unsigned类型  

回复:
user: user-1
content: -1的原码是 1000 0000 0000 0000 0000 0000 0000 0001 不错 不过，他的补码数表示，是用1的补码来表示 也就是 1111，1111，1111，1111，1111，1111，1111，1111 转换成unsigned  什么也不做 照抄就是了，还是 1111，1111，1111，1111，1111，1111，1111，1111

user: user-0
content: 引用 4 楼 lm_whales 的回复:1）无符号，跟有符号（同一长度的int）之间转换 数据（二进制表示）本身没改变，改变的只是数据类型 2）有符号数是所谓补码数 正数用原码表示(即这个数的序号)。 负数，用他的相反数（绝对值）的补码表示。  用+0 的编码（全0），表示0 用-0 的编码（最高位1，其余全0），表示绝对值，比最大正数大1 的负数。 正数的原码，就是正数的二进制表示 负数的原码，就是绝对值是他的相反数，最高位为1 4） 反码，就是原码按位取反  补码等于 反码+1 补码的本意是，两个数的和（除开溢出的丢失的那一位后）为0。则两个数互为补码。 补码数则是正数用原码，负数用（相反数的）补码表示。0 用全0 表示。 多余的一个-0 的编码，表示绝对值大于最大正数的的负数。  -1作为负数在计算机中存的是它的补码，它的原码是 1000 0000 0000 0000 0000 0000 0000 0001  补码 为 1111 1111 1111 1111 1111 1111 1111 1111   -1转换成unsigned无符号的时候，把最高位的1换成0 即 0111 1111 1111 1111 1111 1111 1111 1111 转换成 十进制 正好是  4294967295    是不是这样

user: user-2
content: 6.3.1.3 Signed and unsigned integers 1 When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged. 2 Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type. 3 Otherwise, the new type is signed and the value cannot be represented in it; either the result is implementation-defined or an implementation-defined signal is raised.  这样规定的效果是如果数字用补码表示，同样长度的有符号整数转换为无符号整数，其二进制表示是不变的。（参见7楼）  ====== 写这么复杂的原因是，标准其实是允许用原码或反码表示整数的（虽然实际实现里几乎见不到...）

user: user-3
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-4
content: 得到的是unsigned 能表示的最大值  int的最高位表示的是符号，1为负，0为正  而unsigned全为正  把数值转换成二进制计算下就明白了

user: user-5
content: 引用 5 楼 Hamber_Bao 的回复:[quote=引用 4 楼 lm_whales 的回复:] 1）无符号，跟有符号（同一长度的int）之间转换 数据（二进制表示）本身没改变，改变的只是数据类型 2）有符号数是所谓补码数 正数用原码表示(即这个数的序号)。 负数，用他的相反数（绝对值）的补码表示。  用+0 的编码（全0），表示0 用-0 的编码（最高位1，其余全0），表示绝对值，比最大正数大1 的负数。 正数的原码，就是正数的二进制表示 负数的原码，就是绝对值是他的相反数，最高位为1 4） 反码，就是原码按位取反  补码等于 反码+1 补码的本意是，两个数的和（除开溢出的丢失的那一位后）为0。则两个数互为补码。 补码数则是正数用原码，负数用（相反数的）补码表示。0 用全0 表示。 多余的一个-0 的编码，表示绝对值大于最大正数的的负数。  -1作为负数在计算机中存的是它的补码，它的原码是 1000 0000 0000 0000 0000 0000 0000 0001  补码 为 1111 1111 1111 1111 1111 1111 1111 1111   -1转换成unsigned无符号的时候，把最高位的1换成0 即 0111 1111 1111 1111 1111 1111 1111 1111 转换成 十进制 正好是  4294967295    是不是这样 [/quote] ３２位数-1在内存中就是　0xFFFFFFFF,直接赋给unsigned就是0xFFFFFFFF

user: user-1
content: 4294967295 就是全1 4294967295  = 2^32-1

user: user-1
content: 补码数的特征是（全0 ，以及最高位为1，其余为0 ，的两个编码除外），一对相反数，互为补码

user: user-1
content: 1）无符号，跟有符号（同一长度的int）之间转换 数据（二进制表示）本身没改变，改变的只是数据类型 2）有符号数是所谓补码数 正数用原码表示(即这个数的序号)。 负数，用他的相反数（绝对值）的补码表示。  用+0 的编码（全0），表示0 用-0 的编码（最高位1，其余全0），表示绝对值，比最大正数大1 的负数。 正数的原码，就是正数的二进制表示 负数的原码，就是绝对值是他的相反数，最高位为1 4） 反码，就是原码按位取反  补码等于 反码+1 补码的本意是，两个数的和（除开溢出的丢失的那一位后）为0。则两个数互为补码。 补码数则是正数用原码，负数用（相反数的）补码表示。0 用全0 表示。 多余的一个-0 的编码，表示绝对值大于最大正数的的负数。

user: user-6
content: 值 -1 赋值给unsigned int 类型的时候 存储形式为 1111,1111,1111,1111

user: user-0
content: 引用 1 楼 user-7 的回复:我相信C/C++教程开头就会讲补码..反码...没有讲，你给讲讲吧

user: user-7
content: 我相信C/C++教程开头就会讲补码..反码...