C语言进阶剖析第二课--有符号和无符号
①计算机中的符号位
数据类型的最高位用于标识数据的符号
-最高位为1,表明这个数为负数
-最高位为0,表明这个数为正数
②在计算机内部用补码表示有符号数
正数的补码为正数本身;
负数的补码为负数的绝对值各位取反再加1;
③在计算机内部用原码来表示无符号数
-无符号默认为正数
-无符号数没有符号位
对于固定长度的无符号数
MAX_VALUE + 1 = MIN_VALUE
MIN_VALUE - 1 = MAX_VALUE
④如果无符号数和有符号数相加,有符号数会转成无符号数,并且如果有符号数是负数,那么这个数将会是一个很大的数,并且计算结果是一个无符号数。
计算机中的符号位
数据类型的最高位用于标识数据的符号
-最高位为1,表明这个数为负数
-最高位为0,表明这个数为正数
int sign = 0;
char i = -5;
short j = 5;
int k = -1;
sign = (i & 0x80); //sign不等于0
sign = (j & 0x8000); //sign等于0
sign = (k & 0x80000000); //sign不等于0
在计算机内部用补码表示有符号数
正数的补码为正数本身;
负数的补码为负数的绝对值各位取反再加1;
在计算机内部用原码来表示无符号数
-无符号默认为正数
-无符号数没有符号位
对于固定长度的无符号数
MAX_VALUE + 1 = MIN_VALUE
MIN_VALUE - 1 = MAX_VALUE
C语言变量默认为有符号类型
unsigned关键字声明变量为无符号类型
整数类型能用unsigned来声明,但是浮点数不能用unsigned声明
相互之间的转换:
如果无符号数和有符号数相加,有符号数会转成无符号数,并且如果有符号数是负数,那么这个数将会是一个很大的数,并且计算结果是一个无符号数。
示例程序1:
#include <stdio.h> int main() { unsigned int i = 5; int j = -10; if( (i + j) > 0 ) { printf("i + j > 0\n"); } else { printf("i + j <= 0\n"); } return 0; }
运行结果:
实例程序2:
#include<stdio.h>
int main()
{
unsigned int i = 0;
for(i>9; i>=0; i--)
{
printf("%u\n",i);
}
return 0;
}
运行结果: