『壹』 C语言中如何定义一个不为负数的整形变量
unsigned int a;
表示定义一个不含负数的整型变量,unsigned表示没有负数,int表示整型,a是变量名。
『贰』 C语言有关负整型数据输出的问题
在机器中,所有的数都是以补码的形式存储的
输出的形式不代表存储的形式版
你应该知道printf函数的第权一个参数叫做什么名字(格式字符串),说白了,printf是根据这个字符串来格式那个数字的!你要什么格式,它就输出什么格式。
你用%d输出,它定义的%d就是输出正负号和十进制整数值。你用%o输出,它定义就是不管什么负号不负号的把八进制输出出来。然而printf没有定义带符号八进制的输出格式字串而已(因为没有人习惯看到一个负的八进制或十六进制字符,只是感兴趣除外)
其实,没有必要去琢磨printf到底是怎么输出的,在你能看到的层面上,机器处理数据都是16进制的,而且是没有+-的,你用反汇编软件,用WinHex,用UtralEdit打开一个文件,你看到的最多是十六进制,你看到二进制没有意义的,你看不明白,你也不需要看明白。
即使说printf的代码是汇编写的,你看到了,它只不过把每一位转换成字符,写到输出缓冲区里面,还是看不到补码。
再补充一句,也可以这么理解,你用%o或%x输出,printf把内存中的实际情况显示出来了,你用%d输出,printf自己在中间多了一次转换,让你看得更习惯了。
『叁』 关于在C语言中无符号整形存储负数问题
你的理解是对的来。
最高位为源1时,对于有符号来说,这个数是负数,而对于无符号数而言,由于最高位也是有效存储位,所以可以存储更大范围的数。
话再说回来,既然是无符号数,输出格式应该是"%u",而不是"%d",这样才能做到“表里如一”,“改头换面”只会乱了自己,这不是游戏,严谨是必须的。
『肆』 C语言中如何将字符串转化为整型数,注意负数处理方法
#include<stdio.h>
#include<string.h>
#include<assert.h>
intatoi(char*s)
{
assert(s&&strlen(s));
intflag=1;
intret=0;
while(*s=='-'&&++s&&(flag=-1)==1||*s!='