signed & unsigned

"The type of an object determines the set of values it can have and what operations can be performed on it", - K&R C

 

   转载请注明出处 http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

这是两段很简单的代码,我就以第二段代码为例。

     在计算机中,负数是以补码来存储的。  转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

      C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)

      a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)

执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:

 a没有符号所以转为int型为0x0000FFFF,

 b有符号转换为int型为0xFFFFFFFF。

十进制输出值 65535  -1.   转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

按 Ctrl+C 复制代码
按 Ctrl+C 复制代码

转载请注明出处http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html
a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,

a转换为int型的时候就是0xFFFFFFFF,所以输出-1.

其实,记住两点就行了

1.unsigned 类型转换为 signed类型的时候是直接复制到低位,高位为0.如果signed类型位数不够,只直接装载unsigned低位。

 2.signed类型转换为unsigned类型的时候,也是将补码直接复制到低位,高位为符号位。如果unsigned位数不够,只直接装载signed低位。

 

### 回答1: signed/unsigned mismatch指的是在程序中使用了不同类型的变量进行比较或运算,其中一个是有符号类型(signed),另一个是无符号类型(unsigned),这样会导致类型不匹配的错误。例如,当一个有符号整数和一个无符号整数进行比较时,就会出现signed/unsigned mismatch错误。这种错误可能会导致程序运行异常或崩溃。为避免这种错误,应该在程序中尽可能使用相同类型的变量进行比较和运算。 ### 回答2: signed/unsigned mismatch 是一种编程错误,通常由于使用错误的类型进行操作而导致。signedunsigned 是两种不同的数据类型,分别用来表示有符号和无符号整数。signed 数据类型表示包含符号的整数,可以是正数、负数或零;而 unsigned 数据类型表示仅包含正整数或零的无符号整数。 在 C++ 中,当将一个 signed 数据类型的变量与一个 unsigned 数据类型的变量进行操作时,将导致 signed/unsigned mismatch 错误。这是因为 signed 类型可以存储负值,而 unsigned 类型只能存储非负值。当 signed 数据类型的变量与 unsigned 数据类型的变量进行运算时,编译器会将两个类型转换为相同的类型,这可能导致数据丢失或截断。 例如,如果使用一个 unsigned 数据类型的变量来表示负数,例如 -10,那么出现 signed/unsigned mismatch 错误就会变得非常常见。在这种情况下,编译器将尝试将该负数转换为无符号整数类型,这将导致数据错误或意外结果。 为了避免 signed/unsigned mismatch 错误,应该始终使用正确的数据类型来表示数值。如果需要将 signed 数据类型的变量与 unsigned 数据类型的变量一起使用,应该明确地表示它们的类型转换,以确保数据的正确性。可以使用 C++ 中的 static_cast 运算符来执行显式类型转换。 总之,signed/unsigned mismatch 错误是一种常见的编程错误,可以通过使用合适的数据类型并进行显示类型转换来避免。在编写代码时应该务必小心并仔细审查代码以确保正确性。 ### 回答3: signed/unsigned mismatch是C/C++程序中一个比较常见的错误,通常会在编译阶段被检测到,也可能在运行时会导致程序出现不可预测的错误或者异常。 signed/unsigned mismatch通常是由于不同类型的整数在表达式中混合使用而发生的。例如,当一个signed int类型的变量和一个unsigned int类型的变量进行运算时,就会发生signed/unsigned mismatch的错误。 此外,还有一种情况可能会引起signed/unsigned mismatch的错误,那就是在使用循环计数器时未正确处理数据类型,例如使用signed int型的变量计数并与unsigned int型的变量进行比较。 这个错误发生时的结果可能是期望不一样的或者可能会导致程序崩溃。因此,为了避免这种错误的发生,程序员需要注意一些细节。例如,当我们定义循环计数器时,应该要确保它们的类型相同,或者在将它们混合使用之前先进行类型转换,例如将signed int类型的变量转换为unsigned int类型的变量。 此外,在进行计算或比较之前,我们也应该根据实际需要考虑变量的类型,如果我们需要使用无符号变量,则应该将所有的变量都定义为无符号类型,或者进行适当的强制类型转换。 总之,signed/unsigned mismatch是一个常见的错误,但是只要我们注意避免类型混杂,以及在需要使用无符号变量时使用正确的类型,就可以避免这种错误的发生。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值