int转unsigned会不会有问题

时间:2022-09-11 13:15:14
《c语言程序设计》谭浩强,3.7节54页中,各类数据值数据间的混合运算中,两个操作数数据类型分别为int和unsigned,运算前编译器会自动将int转成unsigned?为什么?
疑问:虽然这两个类型占用的字节数相同,假如是4字节,但表达数据范围是不同的,int为[-2的31次方,2的31次方-1],unsigned为[0,2的32次方-1],两种数据类型代表的意思不同,转换过去的值也没有意义了?请高手指点!

13 个解决方案

#1


有些东西就规矩

本身不同类似的数据相运算就容易出现数据错误。

#2


显然有问题,int a = -1;  UINT(a) = 897***,只要是负数就会出问题,正数没事

#3


整形提升 标准中有很详细的介绍  unsigned long 类型和一个其他类型运算 另一个自动转化unsigned long  
 否则,long类型和另一个unsigned 类型运算  如果结果能完整表示在long中两 个都转化位long 不能就转化为unsigned  long , 否则 一个为long  另一个转化为long   否则一个为unsigned  另一个也转化为unsigned   否则  转化为int

#4


int 型转换为 unsigned类型,原则是位模式不变,只是解释的方式发生了变化,所以只要int型不是负值,两者转换的结果一样

<深入理解计算机系统>一书说unsigned会有很多陷阱,尽量不要使用

#5


正数一般自动转换的数不变,但如果是负数可能会转换成一个很大的正数,估计是因为计算机内部负数用补码表示

#6


规定而已

#7


正数转,绝对没有问题 负数转 绝对有问题

#8


负数转,它的值增加了2的32次方。

#9


结贴吧。

#10


如果你不需要保留符号位的就直接强制转换
需要的话 通过指针
int a = -4;

unsigned int b =  *((unsigned int*)&a)

#11


别取那种边界值就像3楼说的那种,一般没问题

#12


小于int上限的情况下值一致

#13


内存就是字节,4字节摆在那里是不会变的,只是认为的给它一个有符号,无符号,于是那些内存就被当作有符号或者无符号使用了,懂了么。

#1


有些东西就规矩

本身不同类似的数据相运算就容易出现数据错误。

#2


显然有问题,int a = -1;  UINT(a) = 897***,只要是负数就会出问题,正数没事

#3


整形提升 标准中有很详细的介绍  unsigned long 类型和一个其他类型运算 另一个自动转化unsigned long  
 否则,long类型和另一个unsigned 类型运算  如果结果能完整表示在long中两 个都转化位long 不能就转化为unsigned  long , 否则 一个为long  另一个转化为long   否则一个为unsigned  另一个也转化为unsigned   否则  转化为int

#4


int 型转换为 unsigned类型,原则是位模式不变,只是解释的方式发生了变化,所以只要int型不是负值,两者转换的结果一样

<深入理解计算机系统>一书说unsigned会有很多陷阱,尽量不要使用

#5


正数一般自动转换的数不变,但如果是负数可能会转换成一个很大的正数,估计是因为计算机内部负数用补码表示

#6


规定而已

#7


正数转,绝对没有问题 负数转 绝对有问题

#8


负数转,它的值增加了2的32次方。

#9


结贴吧。

#10


如果你不需要保留符号位的就直接强制转换
需要的话 通过指针
int a = -4;

unsigned int b =  *((unsigned int*)&a)

#11


别取那种边界值就像3楼说的那种,一般没问题

#12


小于int上限的情况下值一致

#13


内存就是字节,4字节摆在那里是不会变的,只是认为的给它一个有符号,无符号,于是那些内存就被当作有符号或者无符号使用了,懂了么。