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;
}

原文地址:https://www.cnblogs.com/xiangsikai/p/12371505.html

时间: 2024-10-24 03:49:53

C语言 有符号、无符号的相关文章

INT_MIN 写成 (-2147483647 - 1) 和 vs中 warning C4018: “&gt;”: 有符号/无符号不匹配的深入剖析。

首先明确下4个字节的INT能表示的数字范围是2147483647-- -2147483648,来看我遇到的问题: 这里输出了"相等"说明 (INT_MIN==-2147483648) 为true. 输出了" 1<-2147483648",说明认为 (1<-2147483648) 为true,但是这不科学. 输出了"-1>2147483648"说明 ( -1>2147483648) 为true,这也不科学. INT_MIN和

C语言 宏判断有符号无符号 整型变量

#define ISUNSIGNED(x) ((x)>=0&&~(x)>=0) #define ISSINGNED(x) ((x)>=0?((~(x))<0?true:false):true) 有符号与无符号的区别:最高位是否为1  ,有符号最高位为1表示负数.

【c语言】char无符号超范围的结果

// char无符号超范围的结果 #include <stdio.h> int main() { unsigned char a = 200; unsigned char b = 100; unsigned char c = 0; c = a + b; printf("%d %d\n", a + b, c); // c是无符号char,范围0~255,300超范围了,所以结果为44 return 0; } <img src="http://img.blog.

警告:C4018 &quot;&lt;&quot;:有符号/无符号不匹配

for (i = 0; i<(strlen(arr1)+1)/2; i++) 只需将循环中的"i"在定义时定义为无符号即可,即unsigned i; 产生错误的代码: #include<stdio.h> #include<stdlib.h> #include<string.h> int main() {  char arr1[] = { "Welcome to bit!" };  int num = strlen(arr1)

汇编中的有符号-无符号-溢出-进位

什么是有符号数?什么是无符号数?什么是溢出(OF)?什么是进位(CF)?如何区分有无符号 呢?有符号数,就是带符号的数,可以是正数或负数.区分正数或负数时,看这个数的最高位是 否为 1,最高位为 1,说明它是负数.最高为 0 说明它是正数.例如一个字节有符号数,表示范围(-128 ~ 127):A0 :1010 0000 : -96 最高位为 1,说明是负数 80 :1000 0000 :-128 最高位为 1,说明是负数 5B :0101 1011 : 91 最高位位 0,说明它是正数 09

程序猿之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

程序员之---C语言细节20(符号和有符号之间转换、两数相加溢出后数值计算)

主要内容:无符号和有符号之间转换.两数相加溢出后数值计算 #include <stdio.h> /* 这个函数存在潜在漏洞 */ float sum_elements(float a[], unsigned length) { int i; float result = 0; for(i = 0; i <= length - 1; i++) { result += a[i]; printf("a[%d] = %f \n",i,a[i]); } return resul

有符号数、无符号树混合计算问题。

今天在线刷题,其中一个问题总是结果跟期望的不一样,在一次次的检查程序逻辑.确认无误后,还是不能通过,不得已用VS开始调试! 这里是我的程序代码: 1 // maxDepth.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include<vector> 6 #include<iostream> 7 #include<limits.h> 8 9 using namespace std; 10 1

【VHDL】深度讲解无符号和有符号加法处理溢出的问题

1.Unsigned adders 这个比较简单,只需在A.B前面扩展一位0防止溢出,溢出的数填到第n位cout,n-1到0位就是sum. , 2.Signed adders 一开始也搞不懂下图中为什么要扩展符号位,两个符号位了怎么加?   往下看↓ 2.1 Analysis 在真正开始使用Verilog做signed加法运算前,我们先来看看实际上二进制singed加法是如何运算? Normal Condition (没有Overflow) (+6) + (-3) = (+3) 为了节省reso