当前位置:首页 » 服务存储 » 无符号整型存储负数问题
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

无符号整型存储负数问题

发布时间: 2022-08-16 15:04:15

A. 在C语言中,可以给一个无符号整型变量赋值一个负数吗

可以,但是结果会出错,负数在计算机中最高位为1,作为符号标志(正数为0),但是如果赋给无符号整型变量,最高位的标志位就会变成数值位,计算时把这个1当成数值。

B. C语言中无符号型变量能不能存放负数

可以赋一个负数值给无符号型变量,但是无符号变量将会把这个负数的符号位也纳入计算范围,从而在使用时返回一个正数。

C. 无符号整数为什么还能赋值为负数,该如何处理

计算机在赋值前,默认做一个自动数据类型转换,会将有符号数转换成无符号数再用来赋值。

D. C语言中,unsigned int型数据的取值范围是

0到65535。

举例:

unsigned a;

a=5;

或:unsigned int a;

a=5;

16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned int能存储的数据范围则是0~65535,在计算机中,整数是以补码形式存放的。

系统使用

无符号数只表示大小,有符号数最高位(二进制情况下最高位表示符号位),在同一操作系统下,有符号数和无符号数的最大数值在大小上的关系是2*x+1。二者表示的数据范围大小是相同的,但是范围不同。

C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。

通常,大多数数字默认都是有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。因此在一台二进制补码机器上,当从无符号数转换为有符号数时,效果就是应用U2Tw,而从有符号转换为无符号数时,就是应用函数T2Uw,其中w表示数据类型的位数。

E. 负数为什么能用无符号整型表示

把0到4294967295按顺序排列成一个“环形”,则0两边的数就是1和4294967295,如果无符号整型在使用中没有超出范围,那么结果都是正确的,如果超出了范围,程序也会给出一个结果但这个结果是错误的,错误的结果也是有规律的,比如说,无符号整型所表示的最小的数是0,如果在使用中出现了-1,那么程序给出的(错误)结果就是环形中0旁边的数,显然不会是1,只能是4294967295。依此环形类推,-2就是4294967294,转换成二进制就是1111111111111110(十五个一)。

F. 无符号整数为什么还能赋值为负数

不管是无符号数还是有符号数,都是内存里的一些字节,就看你怎么解释。
比如四个字节的FFFFFFFF,如果是int类型就是-1,unsigned int就是4294967295
int i=-1; 实际上i所在的内存就是4个字节的FF

G. 无符号型变量能否存储负数,如-158

计算机内部的内存,只有 0 和 1,不存在负数。

所以,计算机里的数代表什么,是人为定义的。

其实世界亦是如此。
change 是什么意思?
如果按照英文来解释,是“改变”
如果按照汉语拼音来解释,可以是“嫦娥”“禅歌”等等。

实际上, unsigned int a = -158 ,在内存里是 FFFFFF62(32位二进制,也就是8位十六进制)
如按照无符号解释,是 4294967138。
如按照有符号解释,是 -158
其中,printf 如果用 %d 格式符,则按照有符号解释。如果用 %u 做格式符,则按照无符号解释。

H. 关于在C语言中无符号整形存储负数问题

你的理解是对的。
最高位为1时,对于有符号来说,这个数是负数,而对于无符号数而言,由于最高位也是有效存储位,所以可以存储更大范围的数。
话再说回来,既然是无符号数,输出格式应该是"%u",而不是"%d",这样才能做到“表里如一”,“改头换面”只会乱了自己,这不是游戏,严谨是必须的。

I. 整数,无符号整数和负数在内存中,以什么形式存放

可以这样想,所有的整数都是以补码二进制形式存放的,但是正数的补码是它本身,负数的补码是对位取反末尾加一,无符号整数不需要存储符号位,因此在正数范围内存储的范围更大。

J. C语言中无符号整数变量赋负整数为什么不报错,而且打印这个数也是负数

给一个无符号变量赋一个负数,就把这个“负数”的补码当正数对待了(unsigend的级别高于int)——这和给一个浮点变量赋一个整型数时被提升为浮点型一样——这符合C/C++的自动类型转换规则,所以不报错。至输出还是负数恐怕不对,除非你强制为int型输出,否则输出是无符号的。