unsigned 和 signed

http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

http://m.blog.csdn.net/blog/u010086298/37777607

先看两个例子

#include <stdio.h>
int main(int argc, char *argv[])
{
    unsigned char a = -1;
    char b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果:255  -1
#include <stdio.h>
int main(int argc, char *argv[])
{
    unsigned short a = -1;
    short b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果:65535  -1

在计算机中,负数是以补码来存储的。

C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)。

a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)。

执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:

a没有符号所以转为int型为0x0000FFFF,

b有符号转换为int型为0xFFFFFFFF。

十进制输出值 65535  -1.

#include <stdio.h>
int main(int argc, char *argv[])
{

    unsigned int a = -1;
    int b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果 -1 -1

a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,

a转换为int型的时候就是0xFFFFFFFF,所以输出-1.

规则整理

(1)如果转换前后位数相同,那么其实位本身并没有发生变化,变化的只是对位的解释(符号位)如unsigned int a = -1 int b=a

(2)如果位数变长了, 需要填充,分两种情况。a) unsigned 转换为signed,则填充0, b)signed 转换为unsigned,填充位与符号位相同

(3)如果位数变短了,则直接截断

规则(1)不多说

规则(2)a)由下面的例子验证

//定义了一个有符号的变量
unsigned char  name = 255;
int Pava = name;
//定义了一个短整型,
short Kava = name;
printf("%d\n%d\n",Pava,Kava);// 输出 255 255

(2)b)

char  name = 255;
unsigned int Pava = name;
printf("%d\n",Pava);
//输出 -1

(3)

int  name = 255;
unsigned char Pava = name;
printf("%d\n",Pava);
// 输出 255
时间: 2024-11-01 03:18:21

unsigned 和 signed的相关文章

C语言的补码表示和unsigned及signed的的转换

这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想. C语言的基本类型有char.int.float.double,另外还有说明符long.short.signed和unsigned. 首先要注意在不同操作系统中类型大小不一样,下面的情况只是考虑其中一种情况. int和char均默认为signed,二进制的最高一位来表示符号,0为正1为负. 假如short int是16位,由于第1位表示正负,所以只剩15位

mysql 中int类型字段unsigned和signed的探索

转自:http://www.0791quanquan.com/news_keji/topic_816453/ 探索一:正负数问题 拿tinyint字段来举例,unsigned后,字段的取值范围是0-255,而signed的范围是-128 - 127. 那么如果我们在明确不需要负值存在的情况下,通常是不要设置signed来支持负数的. 因为只支持正数会让存储空间大一倍呢(当然我这种表达可能不准确). 假设我们使用tinyint来存储一些状态值. 0表示删除,1表示待付款,2表示已付款,3....

[C知识点]char unsigned char signed char知识点

1.char,unsigned char, signed char 都是占一个字节. 2.signed char范围为 -128-127  0000 0000表示+0 1000 0000表示-0.+0和-0表示的值是一样的.为了不浪费这一位用1000 0000表示128 unsigned char范围为 0-256. 3. char根据编译器的不同,被解释成signed char或者unsigned char. 4.VC编译器.x86上的GCC都把char定义为signed char,而arm-

unsigned与signed区别

我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数据形式之一,可以究竟对于Integer的定义是什么呢? 翻书看下,在介绍Integer的时候,还有一个关键词就是size(范围) The C Programming Language 写道 an integer,typically reflecting the natural size of int

c语言中的unsigned 和 signed

我们来一起看下,C语言中,对于Integer Type(整数形式)的unsigned与signed两种形式的区别,以及在内存中的存储方式是如何的 Integer type(整数形式)是C语言中的基本数据形式之一,可以究竟对于Integer的定义是什么呢? 翻书看下,在介绍Integer的时候,还有一个关键词就是size(范围) The C Programming Language 写道 an integer,typically reflecting the natural size of int

一段代码的疑问(1)——unsigned与signed

现象: 先来看一段代码: 这段代码的输出结果是: -84 4294967264 分析: [email protected]:~/cpp$ g++ -g c212.cc -o temp [email protected]:~/cpp$ ls c143.cc c144.cc c212.cc temp 可以看到多出一个temp文件 [email protected]:~/cpp$ gdb temp GNU gdb (Ubuntu/Linaro 7.4-2012.04-0ubuntu2.1) 7.4-2

char unsigned char %d %u

前几天遇到了这么个问题 ,在学习 unsigned char和char 和signed char的区别时 ,说char的类型到底是signed 还是unsigned 取决于编译器 . 当时写了一串代码 如下: char a=-1;     printf("%d\n",sizeof(a));     printf("%d\n",a);     printf("%u\n",a); 先说%d 是将数据以int型的 十进制 格式输出: %u 是将数据以u

无符号整型unsigned int、unsigned long、usigned long long、size_t比较和格式控制

位数比较 由于数据的长度和平台相关,所以基于 64 位系统比较. Windows Linux unsigned int 32 bits/4294967295 32 bits unsigned long 32 bits 64 bits/18446744073709551615 unsigned long long 64 bits 64 bits size_t 32 bits 64 bits 可以看到,size_t 和 unsigned long 比较同步.另外 ssize_t 和 size_t 的

进制、内存分析

一.进制 1.什么是进制 是一种计数的方式,数值的表示形式 汉字:十一   十进制:11  二进制:1011  八进制:13 多种进制:十进制.二进制.八进制.十六进制.也就是说,同一个整数,我们至少有4种表示方式 软件开发,肯定要了解这个 2.二进制 1>   特点:只有0和1,逢2进1 2>   书写格式:0b或者0b开头 3>   使用场合:二进制指令\二进制文件,变量在内存中就是二进制存储 4>   二进制和十进制的互相转换 5>   n为二进制位所能表示的数据范围(