(2)C语言中关于unsigned int的问题。

如图所示,C语言中关于unsigned int的问题。急求详解。谢谢。
我的意思是说a=-65535U按书中的说法,-65535应该是按无符号数进行存储。若过这样,在给a赋值的时候, a中的内容不就是错的了?可结果为什么还会对呢?

第1个回答  2012-11-20
很高兴你能来信。首先确认一件事,因为现在大部分的系统中int型都是4个字节,所以在这里我也认为你的系统int型占有4个字节(请自己用sizeof函数确认)。如果是两个字节,那么int型的范围在(-32768--32767)unsigned在(0---65536)。再次,请找一本将计算机原理的书籍好好学习一下。

结果原理是这样的:首先在计算机中负数是用补码表示的,所以无论是-65535u还是-65535在计算机中表示的数就是ffff0001(自己可以分别算算)。a+1之后,b的补码就是ffff0002,你用%d打出来表示的数就是-65534了。

至于你说应该出错,我是不晓得哪点应该出错了。难道是因为你觉得int型的数据不能保存到-65535??那你就该看看你int型的大小了。这种问题想知道原因你不要用%d输出,可以用%x输出对比结果。 有问题再CALL我吧!
诚信ID
第2个回答  2012-11-19
原因在于你printf里面的格式化方法,你用的是%d,%d是将数字当成有符号数翻译的。
有符号与无符号存储的内容是一样的,关键看你是把它当有符号还是无符号看。追问

我的意思是说a=-65535U按书中的说法,-65535应该是按无符号数进行存储。若过这样,在给a赋值的时候, a中的内容不就是错的了?可结果为什么还会对呢?

追答

这有什么错的,存到a里面的是-65535的补码。你把它成无符号数看值就是 4294901761,当成有符号数看就是 -65535。没问题啊?

追问

-65535(有符号),加个U变成“无符号”存储。无符号的最高位不是用来存储符号的,即无符号的最高位不是根据0正,1负的来存放数字的。。而是直接存放非正负号的数字的。
这样-65535(有符号)中的-(负号)放到“无符号”中岂不是会丢失“负号”?那这样不就错了吗?急求详解。。

你所说的“补码”是任何数字等在存储的时候,“都是”补码形式存储的不是?

追答

基本概念问题,回去看看好好入门知识。
-65535与-65535U在32位机上的表示是一样的,都是0xFFFF0001
它到底表示什么,这取决于你怎么看待它,计算机里本来就只有数字。
重申重点:你把它成无符号数看值就是 4294901761,当成有符号数看就是 -65535。

至于你说的什么最高位存储符号什么的,的确是对的。但-65535U之后并不是说最高位会变成0,无符号类型是不会用最高位表示符号的,所以这种情况下数字变成了4294901761。明白?

本回答被网友采纳
第3个回答  2012-11-20
你先试一下这个程序:
#include <stdio.h>
int main()
{

int a=-65535u ;
int b=a+1 ;
unsigned int c=-65535 ;
unsigned int d=c+1 ;
printf("%d,%d\n",a,b) ;
printf("%u,%u\n\n",a,b) ;

printf("%d,%d\n",c,d) ;
printf("%u,%u\n\n",c,d) ;
a=65535u ;
b=a+1 ;
printf("%u,%u\n",a,b) ;
printf("%d,%d\n",a,b) ;
}

-------------------------------------------
原因很简单,你的int是占四个字节大小,储存-65535的时候,符号位是不会被忽略的,你输出的时候是用%d说明是以有符号输出的,符号位就依旧当作符号输出来,用%u的时候,输出才会把符号位当作数据位
,当你用输入负数时,不管是什么数据类型都会在最高位写上1

中文版的今晚发给你

(2)C语言中关于unsigned int的问题。
很高兴你能来信。首先确认一件事,因为现在大部分的系统中int型都是4个字节,所以在这里我也认为你的系统int型占有4个字节(请自己用sizeof函数确认)。如果是两个字节,那么int型的范围在(-32768--32767)unsigned在(0---65536)。再次,请找一本将计算机原理的书籍好好学习一下。结果原理是这样...

C语言中关于unsigned int的问题。
printf说明符%x对应什么,应该是对应unsigned int类型,是2或4字节的数据类型,unsigned char只有一字节,必然会出错

c语言的unsignedint是什么意思?
C语言的unsigned int是无符号整型变量的意思。1. unsigned int定义 在C语言中,`unsigned int`是一种整型数据类型,用于存储整数。与常规的`int`类型不同,`unsigned int`表示的是非负整数,即它不会有负值。这是因为`unsigned int`是无符号的,即不包含表示负数的符号位。2. 存储范围 由于`unsigned...

c语言中的unsignedint是什么
一、unsigned int的基本概念 在C语言中,unsigned int是一种数据类型,用于声明无符号整数变量。这意味着这些整数只能为正数或零。它们通常用于需要正数值范围更大的场合,例如计数循环中的迭代次数。由于不需要存储负数的信息,因此unsigned int能存储的数值范围比有符号整数更大。二、unsigned int的数值范围...

C语言中关于unsigned int 的问题。
也就是说-12345u表示取数值12345u的相反数,12345u是一个整体 书上说的是错的。存储方式都是作为一串二进制,不存在“按无符号数存储”,只是unsigned int 型是按照无符号数的规则读取和使用 不知道-12345的补码是53191这个说法是怎么来的 似乎C语言没有专门输出数字的二进制表现形式的方法……...

c语言问题。联合体为unsigned int型,所以我就在char * itobs函数的参数...
在C语言编程中,联合体的使用往往与数据类型紧密相关。当涉及到将联合体的数据类型从int修改为unsigned int时,关键在于理解两种数据类型的特性和使用场景。通常,你对参数的替换操作在语法层面是可行的。然而,问题可能出在对数据范围的控制和理解上。unsigned int类型不允许负数,这意味着任何尝试对它进行...

C语言 关于unsigned int声明函数的一个问题
这是C语言,你要先定义变量,才可以做其他操作,unsigned int的语句如果写到Dog_Food=1;语句下面,编译就会报错,syntax error near 'unsigned', 这个就是很明显的错误,你做了其他操作后才去定义变量,这样会报错。如果你是VC,然后文件不是.c结尾,他就是C++语言,不会报错 ...

C语言关于unsigned int型加减的问题
由于声明的是unsigned int, 因此会当做非负数处理,这个值可能是 2^16-10 也可能是 2^32-10,取决于编译器int类型所占字节数 无论怎样,这个数是非0的,因此问号表达式的结果是 c\/d = 5\/3 = 1 f 是浮点输出,会把1转化为浮点数 1.000000 \\n 是换行回车 ...

C语言unsigned int
结论:在C语言中,当你错误地定义了一个无符号整数变量(unsigned int)并尝试赋予一个有符号整数(如-100)时,编译器会进行类型转换。这种转换并非简单地将负数变成正数,而是将-100转换为无符号整数范围内的对应值,这可能会导致意料之外的结果。当你使用%d进行打印时,实际上输出的是这个转换后的无...

C语言的unsignedint是什么意思?
C语言中unsigned?int是无符号整数的意思。无符号整型(unsigned?int):(1)我们都知道整型是4个字节(有些编译器不同,可能会是2个),即32位,无符号整型当然也为32位。(2)既然是32位,无符号整型的取值是32个0~32个1,即:0~4294967295(3)我们举个例子:32位有点长,所以我们拿16位的...

相似回答
大家正在搜