[转] Unsigned VS signed
2008-08-24 13:32
190 查看
在定义整数变量的型态的时候可以加上 unsigned 或是 signed, 例如
unsigned char
unsigned short (int)
unsigned long (int)
unsigned int
----------
signed char
signed short (int)
signed long (int)
signed int
--------------
上面 signed 有加和没有加是一样的意义
加上 unsigned 以后,
1. 所需要的数据储存空间和没有加 unsigned 时是一样的
2. 在使用 printf() 打印时基本上你必须分清楚
unsigned 有影响到的是参数的传递, 使用 %d 或是
%u 基本上是看程序设计者自己的选择
int i=-1;
printf("%d %u/n", i, i);
会印出
-1 4294967295
unsigned int i=-1;
printf("%d %u/n", i, i);
也会印出
-1 4294967295
char i=-1;
printf("%d %u/n", i, i);
还是会印出
-1 4294967295
但是
unsigned char i=-1;
printf("%d %u/n", i, i);
则会印出
255 255
这不是 %d 和 %u 的问题, 而是
参数传递时数据转换的问题 (见下面第 3 项)
不一样的地方有下面几个
1. 数据的范围基本上加上 unsigned 以后会变成 2 倍
2. 程序里比较大小的时候
int i=1;
int j=-1;
if (i>j) printf("i>j/n");
else printf("i<=j/n");
你会发现结果是 i>j
unsigned int i=1;
int j=-1;
if (i>j) printf("i>j/n");
else printf("i<=j/n");
你会发现结果是 i<=j
也就是说 signed 和 unsigned 在比较的时候 compiler
会把 signed int 自动当成 unsigned int 来比较
2. 数据转换的时候 (或是函式呼叫的时候)
char i = -128;
int j = i;
变量 i 里面的数据只有 1 个字节, 要放进
变量 j 里面的时候需要做 sign extension
也就是多出来的 3 个字节 (24 个 bit) 都要
填入原来 i 的 sign bit (第 8 个 bit)
以上例来说 (用二进制表示)
i: 10000000
j: 11111111 11111111 11111111 10000000
unsigned char i = -128;
int j = i;
由 unsigned 转为 signed 时前面一率补 0
用二进制表示
i: 10000000
j: 00000000 00000000 00000000 10000000
char i = -128;
unsigned int j = i;
还是做 sign extension
用二进制表示
i: 10000000
j: 11111111 11111111 11111111 10000000
函式呼叫的时候会做型态的转变, 例如
void fun(int x)
{
...
}
呼叫时如果用
unsigned char i=-1;
fun(i);
就会自动做转换
////////////////////unsigned char VS signed char////////////////
C51初期 /xmm1981 发表于2007-09-24, 18:35
[补:VS上的char是signed char实现]
Character values of type unsigned char have a range from 0 to 0xFF hexadecimal. A signed char has range 0x80 to 0x7F. These ranges translate to 0 to 255 decimal, and –128 to +127 decimal, respectively. The /J compiler option changes the default from signed to unsigned.
char 是有符号的
unsigned char 是无符号的,里面全是正数
两者都作为字符用的话是没有区别的,但当整数用时有区别:
char 整数范围为-128到127( 0x80__0x7F),
而unsigned char 整数范围为0到255( 0__0xFF )
多数情况下,char ,signed char 、unsigned char 类型的数据具有相同的特性然而当你把一个单字节的数赋给一个大整型数域时,便会看到它们在符号扩展上的差异。另一个区别表现在当把一个介于128和255之间的数赋给signed char 变量时编译器必须先进行数值转化,同样还会出现警告。若使用十六进制进行赋值使用unsigned char 要方便一些.根据编译器具体实现情况不同,char要么和signed char等同,要么和unsigned char等同.
功能:统计字符串里面的汉字的个数 (gb2312编码内码大于0xa0)
char szText[]= "12345你好";
l= strlen(szText);
int sum=0;
for (int i=0; i< l; i++)
if (szText[i] > 0xa0)
sum++;
sum/=2;
这样你根本统计出到任何汉字,
因为char是有符号的,打最大就是127,超过就变成复数了。比如7f 是127,那么80就是-1了。
这时候你一定要写成
unsigned char szText[]= "12345你好";
unsigned char
unsigned short (int)
unsigned long (int)
unsigned int
----------
signed char
signed short (int)
signed long (int)
signed int
--------------
上面 signed 有加和没有加是一样的意义
加上 unsigned 以后,
1. 所需要的数据储存空间和没有加 unsigned 时是一样的
2. 在使用 printf() 打印时基本上你必须分清楚
unsigned 有影响到的是参数的传递, 使用 %d 或是
%u 基本上是看程序设计者自己的选择
int i=-1;
printf("%d %u/n", i, i);
会印出
-1 4294967295
unsigned int i=-1;
printf("%d %u/n", i, i);
也会印出
-1 4294967295
char i=-1;
printf("%d %u/n", i, i);
还是会印出
-1 4294967295
但是
unsigned char i=-1;
printf("%d %u/n", i, i);
则会印出
255 255
这不是 %d 和 %u 的问题, 而是
参数传递时数据转换的问题 (见下面第 3 项)
不一样的地方有下面几个
1. 数据的范围基本上加上 unsigned 以后会变成 2 倍
2. 程序里比较大小的时候
int i=1;
int j=-1;
if (i>j) printf("i>j/n");
else printf("i<=j/n");
你会发现结果是 i>j
unsigned int i=1;
int j=-1;
if (i>j) printf("i>j/n");
else printf("i<=j/n");
你会发现结果是 i<=j
也就是说 signed 和 unsigned 在比较的时候 compiler
会把 signed int 自动当成 unsigned int 来比较
2. 数据转换的时候 (或是函式呼叫的时候)
char i = -128;
int j = i;
变量 i 里面的数据只有 1 个字节, 要放进
变量 j 里面的时候需要做 sign extension
也就是多出来的 3 个字节 (24 个 bit) 都要
填入原来 i 的 sign bit (第 8 个 bit)
以上例来说 (用二进制表示)
i: 10000000
j: 11111111 11111111 11111111 10000000
unsigned char i = -128;
int j = i;
由 unsigned 转为 signed 时前面一率补 0
用二进制表示
i: 10000000
j: 00000000 00000000 00000000 10000000
char i = -128;
unsigned int j = i;
还是做 sign extension
用二进制表示
i: 10000000
j: 11111111 11111111 11111111 10000000
函式呼叫的时候会做型态的转变, 例如
void fun(int x)
{
...
}
呼叫时如果用
unsigned char i=-1;
fun(i);
就会自动做转换
////////////////////unsigned char VS signed char////////////////
C51初期 /xmm1981 发表于2007-09-24, 18:35
[补:VS上的char是signed char实现]
Character values of type unsigned char have a range from 0 to 0xFF hexadecimal. A signed char has range 0x80 to 0x7F. These ranges translate to 0 to 255 decimal, and –128 to +127 decimal, respectively. The /J compiler option changes the default from signed to unsigned.
char 是有符号的
unsigned char 是无符号的,里面全是正数
两者都作为字符用的话是没有区别的,但当整数用时有区别:
char 整数范围为-128到127( 0x80__0x7F),
而unsigned char 整数范围为0到255( 0__0xFF )
多数情况下,char ,signed char 、unsigned char 类型的数据具有相同的特性然而当你把一个单字节的数赋给一个大整型数域时,便会看到它们在符号扩展上的差异。另一个区别表现在当把一个介于128和255之间的数赋给signed char 变量时编译器必须先进行数值转化,同样还会出现警告。若使用十六进制进行赋值使用unsigned char 要方便一些.根据编译器具体实现情况不同,char要么和signed char等同,要么和unsigned char等同.
功能:统计字符串里面的汉字的个数 (gb2312编码内码大于0xa0)
char szText[]= "12345你好";
l= strlen(szText);
int sum=0;
for (int i=0; i< l; i++)
if (szText[i] > 0xa0)
sum++;
sum/=2;
这样你根本统计出到任何汉字,
因为char是有符号的,打最大就是127,超过就变成复数了。比如7f 是127,那么80就是-1了。
这时候你一定要写成
unsigned char szText[]= "12345你好";
相关文章推荐
- Signed vs. Unsigned
- unsigned vs. signed in C/C++
- Unsigned vs. Signed
- unsigned vs signed
- (原创)HDL中的unsigned与signed
- signed 与unsigned 理解
- unsigned与signed之间的区别;微软试题已知unsigned int i=3;unsigned j;输出j=i*(-1)的结果详解
- signed与unsigned类型相加
- (C语言)signed和unsigned类型转化
- C语言 unsigned 和 signed 类型相互转换深入理解
- unsigned和signed
- signed and unsigned of verilog
- c++需要注意unsigned与signed区别
- 一段代码的疑问(1)——unsigned与signed
- 不带signed或unsigned关键字的char型 无符号数? 有符号数? C标准规定为 Implementation Defined !!!
- signed和unsigned取值范围的问题
- unsigned 和 signed
- unsigned 和 signed之间的转换关系
- 关键字-分节5(signed、unsigned)
- app-release-unsigned.apk is not signed