C语言 有符号、无符号
C语言 有符号、无符号
有符号无符号说明
一、有符号 signed
-
char 8bit 取值范围:-2^7 ~ 2^7-1 、 -128~127
-
int 32bit 取值范围:-2^31 ~ 2^31-1 、 -2147483648~2147483647
-
long long 64bit 取值范围:-2^63 ~ 2^63-1
#include <stdio.h> int main() { signed int a = -1089474374; //定义有符号整型变量a printf("%X\n", a); //结果为 BF0FF0BA //B F 0 F F 0 B A //1011 1111 0000 1111 1111 0000 1011 1010 return 0; }
注:数据存储时将-0对应的区间值设置为最小值 -2^7
二、无符号 unsigned
1、说明
数据存储在计算机中不存在符号位
无符号数最高位不是符号位,而就是数的一部分,无符号数不可能是负数。
#include <stdio.h> int main() { unsigned int a = 3236958022; //定义无符号整型变量a printf("%X\n", a); //结果为 C0F00F46 return 0; }
2、详解
当我们写程序要处理一个不可能出现负值的时候,一般用无符号数,这样可以增大数的表达最大值。
-
char 8bit 取值范围:0~2^8-1、0~255
-
int 32bit 取值范围:0~2^32-1、0~4294967295
3、表范围
数据类型 |
占用空间 |
取值范围 |
short |
2字节 |
-32768 到 32767 (-215 ~ 215-1) |
int |
4字节 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
long |
4字节 |
-2147483648 到 2147483647 (-231 ~ 231-1) |
unsigned short |
2字节 |
0 到 65535 (0 ~ 216-1) |
unsigned int |
4字节 |
0 到 4294967295 (0 ~ 232-1) |
unsigned long |
4字节 |
0 到 4294967295 (0 ~ 232-1) |
数据溺出说明
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
#include <stdio.h> int main() { char ch; //符号位溢出会导致数的正负发生改变 ch = 0x7f + 2; //127+2 printf("%d\n", ch); // 0111 1111 //+2后 1000 0001,这是负数补码,其原码为 1111 1111,结果为-127 //最高位的溢出会导致最高位丢失 unsigned char ch2; ch2 = 0xff+1; //255+1 printf("%u\n", ch2); // 1111 1111 //+1后 10000 0000, char只有8位最高位的溢出,结果为0000 0000,十进制为0 ch2 = 0xff + 2; //255+1 printf("%u\n", ch2); // 1111 1111 //+1后 10000 0001, char只有8位最高位的溢出,结果为0000 0001,十进制为1 return 0; }