要把一个较小的常量作为long类型对待,可以在值的末尾加上l(小写的L)或L后缀。使用L后缀更好,因为l看上去和数字1很像。因此,在int为16位、long为32位的系统中,会把7作为16位存储,把7L作为32位存储。l或L后缀也可用于八进制和十六进制整数,如020L和0x10L。类似地,在支持long long类型的系统中,也可以使用ll或LL后缀来表示long long类型的值,如3LL。另外,u或U后缀表示unsigned long long,如5ull、10LLU、6LLU或9Ull。
可以把无符号整数j看作是汽车的里程表。当达到它能表示的最大值时,会重新从起始点开始。整数i也是类似的情况。它们主要的区别是,在超过最大值时,unsigned int类型的变量j从0开始;而int类型的变量i则从−2147483648开始。注意,当i超出(溢出)其相应类型所能表示的最大值时,系统并未通知用户。因此,在编程时必须自己注意这类问题。
溢出行为是未定义的行为,C标准并未定义有符号类型的溢出规则。以上描述的溢出行为比较有代表性,但是也可能会出现其他情况。
2.4 整数溢出
如果整数超出了相应类型的取值范围会怎样?下面分别将有符号类型和无符号类型的整数设置为比最大值略大,看看会发生什么(printf()函数使用%u说明显示unsigned int类型的值)。
/* toobig.c-exceeds maximum int size on our system */#include int main(void){ int i = 2147483647; unsigned int j = 4294967295; printf("%d %d %d", i, i+1, i+2); printf("%u %u %u", j, j+1, j+2); return 0;}#+RESULTS:: 2147483647 -2147483648 -2147483647: 4294967295 0 1
2.5.打印short、long、long long和unsigned类型
打印unsigned-int类型的值,使用%u转换说明;打印long类型的值,使用%ld转换说明。如果系统中int和long的大小相同,使用%d就行。但是,这样的程序被移植到其他系统(int和long类型的大小不同)中会无法正常工作。在x和o前面可以使用l前缀,%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型整数。注意,虽然C允许使用大写或小写的常量后缀,但是在转换说明中只能用小写。
C语言有多种printf()格式。对于short类型,可以使用h前缀。%hd表示以十进制显示short类型的整数,%ho表示以八进制显示short类型的整数。h和l前缀都可以和u一起使用,用于表示无符号类型。例如,%lu表示打印unsigned long类型的值。程序清单3.4演示了一些例子。对于支持longlong类型的系统,%lld和%llu分别表示有符号和无符号类型。第4章将详细介绍转换说明。
/* print2.c-more printf() properties */#include int main(void){ unsigned int un = 3000000000; /* system with 32-bit int */ short end = 200; /* and 16-bit short */ long big = 65537; long long verybig = 12345678908642; printf("un = %u and not %d", un, un); printf("end = %hd and %d", end, end); printf("big = %ld and not %hd", big, big); printf("verybig= %lld and not %ld", verybig, verybig); return 0;}#+RESULTS:: un = 3000000000 and not -1294967296: end = 200 and 200: big = 65537 and not 1: verybig= 12345678908642 and not 12345678908642
该例表明,使用错误的转换说明会得到意想不到的结果。第1行输出,对于无符号变量un,使用%d会生成负值!其原因是,无符号值3000000000和有符号值−129496296在系统内存中的内部表示完全相同。因此,如果告诉printf()该数是无符号数,它打印一个值;如果告诉它该数是有符号数,它将打印另一个值。在待打印的值大于有符号值的最大值时,会发生这种情况。对于较小的正数(如96),有符号和无符号类型的存储、显示都相同。
第2行输出,对于short类型的变量end,在printf()中无论指定以short类型(%hd)还是int类型(%d)打印,打印出来的值都相同。这是因为在给函数传递参数时,C编译器把short类型的值自动转换成int类型的值。你可能会提出疑问:为什么要进行转换?h修饰符有什么用?第1个问题的答案是,int类型被认为是计算机处理整数类型时最高效的类型。因此,在short和int类型的大小不同的计算机中,用int类型的参数传递速度更快。第2个问题的答案是,使用h修饰符可以显示较大整数被截断成short类型值的情况。第3行输出就演示了这种情况。把65537以二进制格式写成一个32位数是00000000000000010000000000000001。使用%hd,printf()只会查看后16位,所以显示的值是1。与此类似,输出的最后一行先显示了verybig的完整值,然后由于使用了%ld,printf()只显示了存储在后32位的值。
本章前面介绍过,程序员必须确保转换说明的数量和待打印值的数量相同。以上内容也提醒读者,程序员还必须根据待打印值的类型使用正确的转换说明。
c语言输入scanfHere, we have to declare an unsigned integer variable and ... 在这里,我们必须声明一个无符号整数变量,并使用C语言中的scanf()函数读取其值。 The data type to declare an unsigned intege...
c语言输入scanf
Here, we have to declare an unsigned integer variable and read its value usingscanf() function in C.
在这里,我们必须声明一个无符号整数变量,并使用C语言中的scanf()函数读取其值。
The data type to declare an unsigned integer is:unsigned int and the format specifier that is used withscanf() andprint() forunsigned int type of variable is"%u".
声明无符号整数的数据类型为: unsigned int ,与scanf()和print()一起用于变量的无符号int类型的格式说明符为“%u” 。
Program:
程序:
#includeint main(void) { unsigned int value;	printf("Enter an unsigned int value: ");	scanf("%u", &value);	printf("value: %u\n", value);	//input again	printf("Enter an unsigned int value again: ");	scanf("%u", &value);	printf("value: %u\n", value);	//input again	printf("Enter an unsigned int value again: ");	scanf("%u", &value);	printf("value: %u\n", value);	return 0; }
Output
输出量
Enter an unsigned int value: 123712 value: 123712 Enter an unsigned int value again: -1 value: 4294967295 Enter an unsigned int value again: 25501 value: 25501
Note:See the input second and its result, when we provide-1to an unsigned integer value, it assigns"maximum value to an unsigned int"to the variable.
注意:请参见第二秒钟的输入及其结果,当我们为无符号整数值提供-1时,它将为变量分配“无符号整数的最大值”。
翻译自:https://www.includehelp.com/c-programs/input-an-unsigned-integer-value-using-scanf.aspx
c语言输入scanf
原因是,Char型数组的长度一定是>=0,所以strlen()函数的返回值是一个无符号整数,7-3=-4在无符号整数中自动转化成一个正整数,在visualstudio 2012下debug会看到如下所示的结果,差值是一个429...的大数,所以...

首先来看一道题目:

自己写一遍运行一下,发现打印了“ok”,怪怪的,str2比str1长吗?
为什么呢?
原因是,Char型数组的长度一定是>=0,所以strlen()函数的返回值是一个无符号整数,4-7=-3在无符号整数中自动转化成一个正整数,在visualstudio 2012下debug会看到如下所示的结果,差值是一个429...的大数,所以结果出错:
下面,程序做一点点修改,把strlen(str2)和strlen(str1)强转成int型,int型默认为有符号数,就出现了正确的结果,如下图所示:
另外,在看一个特别的地方:
Str2数组有5个字符,但是strlen(str2)的返回值却是4,原来str[4]=’\0’,在内存中存储标志着字符串的结束,但是却不算在字符串的长度之内。