C语言中unsigned和signed数据的转换

假设signed int c,d=-15;unsigned int e,f=12345;c=f;e=d;为什么c=12345;
e=65521。我不是很明白,请大家指教下。谢谢大家

先讲一下 原码 补码 反码的 概念
正整数的 原码 补码 反码 都是一样的

负数的反码是将其原码除 符号位之外的各位取反
负数的补码是将其原码除 符号位之外的各位取反 再在末尾加1

假设 存在 一个字节的整型 signed int8 x = -5
x的原码1000 0101(最高位是符号位 1表示负 0表示正)
x的反码1111 1010
x的补码1111 1011

储存的计算中的 -5 不是我们更能理解的10000101,而是 -5 的补码1111 1011

现在 回答你的问题:
unsigned int e,f=12345;
f是无符号 所以 f的 原码 补码是一样的:0000 0100 1101 0011
因此c还是等于12345

signed int c,d=-15;
d是负数 所以 d的原码是1000 0000 0000 1111
d的补码是1111 1111 1111 0001

c = f = 0000 0100 1101 0011 转换成 十进制 就是 12345
e = d = 1111 1111 1111 0001 因为e是无符号整型 所以计算机直接将
1111 1111 1111 0001 当做正整数来处理的,没有了补码转换成原码的过程了。
因此你看到的e不是等于 -15 (用十进制表示)而是 65521(用十进制表示)

总结:这个问题的关键是 我们在计算机屏幕上看到的是 原码;而储存的计算中的是 补码。正整数的原码 补码是一样的,而负数的原码 补码是 不一样的,
如果你了解这个概念的话,这个问题就很容易理解了
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-07-13
你赋予c=f;e=d,f=12345,不用说了吧
16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。
而你的d=-15,也就是说65535-15=65521

C语言中unsigned和signed数据的转换
转换成 十进制 就是 12345 e = d =

C语言 unsigned short 如何相互转 signed char
结果是:0, 0, 256, 65280.这道题最难得部分,莫过于你是否理解c语言中的数据类型转换 。有个名词“Inerger Promotion"(整型提升):在算术类型中有这么一种转换,有符号或无符号的char型,short型和Bit-field在做算术运算之前,首先要做整型提升,然后才能参与运算。(其它的一些类型之间的转换...

C++ 类型变换signed->unsigned
unsigned 和 signed 类型如果大小相同,或者 unsigned 更大,那么 signed 会转换成 unsigned。如果 signed 类型占的更大,这个就跟运行环境相关了。以 unsigned int 和 long 举例,如果在当前环境中 long 和 unsigned int 占的字节一样,那么 unsigned int 的值强行转换成 long 可能会有丢失,long 就会...

关于C语言中有符号型signed和无符号型unsigned的区别
unsigned表示无符号的,所有位都为大小,没有正负,例如unsignedint大小区间为0~127。2、类型的不同 signed类型的整数,只用了去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15to2^15-1),也就是...

C语言中unsigned和signed在声明时有什么作用
相比之下,signed是默认的整数类型,包括char,表示有符号整数,其范围可能根据数据类型有所不同。无符号版本的变量可以存储两倍于有符号类型的正整数。在实际编程中,正确理解并选择signed或unsigned取决于具体的使用场景。它们之间的转换规则也值得注意。例如,当将小类型的值转换为int时,如果超出了int的...

求大神!C语言中signed int 和 unsigned int 之间的运算遵循怎样的规则...
会默认变成signed进行计算 最后的结果会是signed 写一个简单的例子就能看出来 include <stdio.h>int main(int argc,char **argv){ signed int a=-5; unsigned int b=3; printf("%d\\n",a+b); return 0;}可见得到的结果是有符号的 ...

C语言中unsigned和signed在声明时有什么作用?
1、unsigned的作用就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。看起来unsigned 是个不错的类型,尤其是用在自增或者没有负数的情况。但是在实际使用中会出现一些意外的情况。2、signed在默认情况下声明的整型变量都是有符号的类型(char...

C语言丨关键字signed和unsigned 的使用与区别详解
C语言中的signed和unsigned关键字用于区分整数变量的符号类型,signed表示有符号,而unsigned则表示无符号。这两者在数据存储和处理上有着显著的不同。Signed(有符号)Signed关键字用于声明有符号整数,如int、short和long等。默认情况下,这些类型都是有符号的,无需额外标注。signed的作用在于明确变量可以...

c语言unsigned int输入用%什符号么
你printf中 是用的是%d, 这个转换说明符的意思是把数据以有符号十进制的形式打印出来,signed int(编译器允许简写为int)是有符整形数,他的字节不能少于2个,现在的操作系统基本上把它设置为4个字节, 对于4个字节的int 它的取值范围是-2147483647到2147483647,...

关于c语言中有符号型signed和无符号型unsigned的区别
一、明确答案:在C语言中,signed和unsigned是用于声明整数类型的修饰符。它们的区别在于如何处理数值的正负性以及所能表示的数值范围。二、详细解释:1. signed类型:signed关键字表示该整数类型可以表示正数、负数以及零。例如,在声明一个signed int类型的变量时,该变量可以存储从负的最大整数值到正的最...

相似回答