02_有符号数与无符号数

有符号数与无符号数

1、计算机中的符号位

编程实验:

#include <stdio.h>

int main()
{
    char c = -5;
    short s = 6;
    int i = -7;

    printf("%d\n", ( (c & 0x80) != 0 ));
    printf("%d\n", ( (s & 0x8000) != 0 ));
    printf("%d\n", ( (i & 0x80000000) != 0 ));

    return 0;
}

输出结果为:

2、有符号数的表示方法

在计算机内部用补码表示有符号数

正数的补码为正数本身

负数的补码为负数的绝对值各位取反后加1

8位整数5的补码 0000 0101

8位整数-7的补码 1111 1001

16位整数20的补码 0000 0000 0001 0100

16位整数-13的补码 1111 1111 1111 0011

3、无符号数的表示方法

在计算机内部用原码表示无符号数

- 无符号数默认为正数

- 无符号数没有符号位

对于固定长度的无符号数

- MAX_VALUE + 1 → MIN_VALUE

- MIN_VALUE - 1 → MAX_VALUE

举例:

一个字节大小的无符号数 1111 1111 + 1 = 0

一个字节大小的无符号数 0 - 1 = 1111 1111

4、当有符号数遇上无符号数

当无符号数与有符号数混合计算时,会将有符号数转化为无符号数后再进行计算,结果为无符号数。

编程实验:

#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");
    }

 if(i > j)
  printf("i > j\n");
 else if(i < j)
  printf("i < j\n");

 return 0;
}

输出结果为:

5、错误地使用unsigned

编程实验:

#include <stdio.h>

int main()
{
    unsigned int i = 0;

    for(i=9; i>=0; i--)
    {
        printf("i = %u\n", i);
    }

    return 0;
}

输出结果为:死循环

原因:变量i是unsigned int类型,一直都是大于等于0的,所以for循环的条件一直都成立

6、小结

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">

来自为知笔记(Wiz)

原文地址:https://www.cnblogs.com/chen-ace/p/9838182.html

时间: 2024-10-05 22:48:30

02_有符号数与无符号数的相关文章

有符号数的加减法 和无符号数的加减法,和,系统是如何识别有符号数和无符号数的

一.有符号数的加减法 1.符号数与无符号数的人为规定性: 一个数,是有符号数还是无符号数都是人为规定的.进行二进制运算时用无符号数或是补码运算时,结果都是正确的. 10000100+00001110 若规定为无符号数,即 132+146=146D . 若规定为符号数,则为-124+14=-110,而[-110]补=10010010.解释:10000100是 -124的补码,0001110是14的补码,在机器中运算后得出的结果是[-110]的补码.机器中的有符号数的运算一般就是补码的运算. 2.补

有符号数和无符号数负数(转)

有符号数和无符号数负数 理解有符号数和无符号数负数在计算机中如何表示呢? 这一点,你可能听过两种不同的回答. 一种是教科书,它会告诉你:计算机用"补码"表示负数.可是有关"补码"的概念一说就得一节课,这一些我们需要在第6章中用一章的篇幅讲2进制的一切.再者,用"补码"表示负数,其实一种公式,公式的作用在于告诉你,想得问题的答案,应该如何计算.却并没有告诉你为什么用这个公式就可以和答案? 另一种是一些程序员告诉你的:用二进制数的最高位表示符号,最高

有符号数和无符号数

摘抄自:http://www.cnblogs.com/glacierh/archive/2013/07/16/3194658.html 1.      补码 在计算机中无符号数用原码表示,有符号数用补码表示.w位补码表示的值为: 最高位 也称符号位,1表示负数,0表示正数,符号位为0时,和无符号数的表示是相同的,以下是4位补码的示例: 0101 = -0*23 + 1*22 + 0*21 + 1*20 = 5 1101 = -1*23 + 1*22 + 0*21 + 1*20 = -3 w位的补

C语言之有符号数和无符号数

我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时候需要使用有符号数来表示一个整数,因此我们规定,当最高位为1的时,表示为负数,最高位为0时,表示为正数. 1:有符号数和无符号数在数值上的区别. 有符号数的最高位用来表示符号,所以在最大的数值上,有符号数的最大值小于无符号数.以一个字节为例: 有符号数的取值范围为:-128 - 0 - 127 无符

FPGA中的有符号数和无符号数的运算

在FPGA设计中,所有的算数运算符都是按照无符号数进行的.如果要完成有符号数计算,对于加.减操作通过补码处理即可用无符号加法完成.对于乘法操作,无符号数直接采用“*”运算符,有符号数运算可通过定义输出为 signed 来处理. 需要注意的是,尽量不要使有符号数与无符号数进行混合计算.因为只要有一个无符号数的运算单元,整个算式将被将成无符号数进行计算.   总之,正数和负数处理时都是按照补码的形式处理,具体究竟把这些补码理解为符号型还是无符号型,这就要看reg signed这样的声明了.如果声明了

C语言基础(5)-有符号数、无符号数、printf、大小端对齐

1.有符号数和无符号数 有符号数就是最高位为符号位,0代表正数,1代表负数 无符号数最高位不是符号位,而就是数的一部分而已. 1011 1111 0000 1111 1111 0000 1011 1010,如果当有符号数看待,那么他是一个负数的补码,如果当一个无符号数看待,他就是一个正数的原码 无符号数最小为0,不可能是负数 定义一个无符号的int unsigned int a; //使用unsigned int 定义了一个无符号的int变量,名字叫a short,long,long long,

关于有符号数和无符号数的转换 - C/C++

转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题,被它们之间的转换原理和位移原理搞得头大了.真的很后悔本科的时候没有认真学习<计算机组成原理>/<计算机操作系统>等计算机基础课程.以下是我根据相关知识回顾和整理的材料,如有和某某的文章有雷同之处,请勿见怪.另外也希望看到这篇文章的同志们能够有所收获吧. #include <cst

C/C++ 有符号数和无符号数

在开始话题前,不妨先来看看以下这段代码 1 #include <iostream> 2 #include <stdio.h> 3 4 int main() { 5 int a = -1; 6 unsigned int b = 1; 7 std::cout << "a > b is " << (a > b) << std::endl; 8 std::cout << "a - b = "

注意sizeof()返回的数无符号数,有符号数遇到无符号数时变成无符号数

预测一下这道题的结果,注意unsigned与signed #include<iostream> #include<stdio.h> using namespace std; int arr[]={1,2,3,4,5}; int main(){ for(int i=-1;i<sizeof(arr)/sizeof(arr[0]) - 1;i++) cout<<arr[i+1]<<endl; } sizeof()返回的值是无符号数,有符号数遇到无符号数变成无