精华内容
下载资源
问答
  • c语言无符号整型

    千次阅读 2010-10-25 22:46:00
    #include #include int main(){  char a[] = "hello";  char b[] = "hi";...strlen的结果是个无符号数,所以strlen(a)-strlen(b)的结果也将是无符号数,不可能是负的。 (参考书籍:c和指针)

    #include <stdio.h>

    #include <string.h>

    int main(){

        char a[] = "hello";
        char b[] = "hi";
        if( (strlen(b)-strlen(a))>=0 )
            printf("It's strange!/n");
        return 1;
    }

     

    strlen的结果是个无符号数,所以strlen(a)-strlen(b)的结果也将是无符号数,不可能是负的。

    (参考书籍:c和指针)

    展开全文
  • C语言无符号整型的输出

    千次阅读 2017-06-28 18:09:49
    这个数按照无符号数输出:也就是0xffff 也就是65535. 从可视化的-1怎么转换到补码形式:因为假设你的平台是16位的 -1补码 = 2^16 - |-1| = 1 0000 0000 0000 0000 - 1 = 1111 1111 1111 1111: 注: 16位系统中...
    分析下面的程序:
    int main()

    unsigned int a ;

            int b=-1;
    a=b;

    printf(“%u”,a);

    }


    分析:如果此平台int是16位的,则

    -1在内存中是以补码形式存储的。补码的二进制为:1111 1111 1111 1111
    这个数按照无符号数输出:也就是0xffff 也就是65535.
    从可视化的-1怎么转换到补码形式:因为假设你的平台是16位的
    -1补码 = 2^16 - |-1| = 1 0000 0000 0000 0000 - 1 = 1111 1111 1111 1111:
    注:16位系统中一个int能存储的数据的范围为-32768~32767,而unsigned能存储的数据范围则是0~65535。-1的十六进制表示为:0xffff 与65535的16进制表示一致。
    
    
    
    

    展开全文
  • 12月21日随笔 12月21日随笔 无符号数 unsigned 结构体指针 整型提升 关于编译顺序的问题 ...无符号数 unsigned ...它和普通的变量定义是一样...而以无符号打印则是32位全1的二进制数转换的整数。 #include void fun

    12月21日随笔

    本文有后续详细讲解

    无符号数 unsigned

    它和普通的变量定义是一样的,只不过差别在于系统对这块内存空间的识别不同。在下例中给n传的实参是-1,在函数中以%d打印仍是-1.而以无符号数打印则是32位全1的二进制数转换的整数。

    #include <stdio.h>
    void func(unsigned int n){
        printf("%d\n",n);      //-1
        printf("%u",n);        //4294967295
    }
    int main(){
    
        int a =-1;
        func(a);
    } 

    结构体指针

    结构体实例使用 . 访问成员

    结构体指针使用 -> 访问成员更为便捷

    -> 其实执行了两步,首先解引用指针,然后作为实例访问结构体变量。

    struct stu s;
    struct stu* p = &s;
    (*p).age = 9;
    p->age = 9; 

    整型提升

    例如

    char a = 1;
    char b = 127;
    char c = a + b;
    printf("%d %d",a + b, c);   // 128    -128(10000000)负零解析为-128

    C的整型算术运算总是至少以缺省整型类型的精度来进行的。为了获得这个精度,表达式中的字 符和短整型操作数在使用之前被转换为普通整型,这种转换称为『整型提升』。

    在上例中a和b都被提升为整型来参与运算,

    a   = 00000000..00000001
    b   = 00000000..01111111
    相加   = 00000000..10000000         //128
    //而保存在c中以后,最高位变成符号位
    c   = 10000000             //-128

    关于编译顺序的问题

    c = (++a) + (++a) + (++a) ;

    上述表达式在不同的编译器中编译结果是不尽相同的,仅从运算符优先级和结合型不能确定最终的值。比如上式不能知道在编译后到底是先执行完三个括号里的自加,还是先执行前两个括号然后相加再执行后一个括号。这种式子属于错误表达,没有研究的价值。

    展开全文
  • 就是当一个无符号类型与int或更小的整形混合使用时,结果类型是无符号类型,这个规则简单,与硬件无关,但是有时会使一个负数丢失符号位。 结合上例,在ANSI C编译器下,unsigned char的1被提升为int类型,所以if...

    算术类型转换

    首先给出一段C代码:

    int main(void)
    {
    	if (-1 < (unsigned char)1)
    		printf("true, ANSI C semantics\n");
    	else
    		printf("false, K&R C semantics\n");
    	return 0;
    }
    复制代码

    这段程序分别在ANSI C和K&R C编译器下编译的话,运行的结果是不同的。-1的位模式是一样的,但ANSI C编译器将它解释为有符号数,是个负数。K&R C编译器却将它解释为无符号数,变成了一个非常大都正数。这是因为两个标准在做算术类型转换时使用的规则不同导致的。

    在《The C Programming Language》A.6算术类型转换 章节详细描述了ANSI C的转换规则。 许多运算符都会以类似的方式在运算过程中引起转换,并产生结果类型。其效果是将所有操作数转换为同一公共类型,并以此作为结果的类型。这种方式的转换称为普通算术类型转换。

    首先,如果任何一个操作数为long double类型,则将另一个操作数转换为long double类型。

    否则,如果任何一个操作数为double类型,则将另一个操作数转换为double类型。

    否则,如果任何一个操作数为float类型,则将另一个操作数转换为float类型。

    否则,同时对两个操作数进行整形提升(integral promotion)。所谓整形提升,就是在一个表达式中,char,short,int型位域(bit-field),包括它们的有符号类型或者无符号类型,以及枚举类型等这些类型都需要提升为int或者unsigned int类型。如果原始类型的所有值都可用int类型表示,则其值将被转换为int类;否则将被转换为unsigned int类型。

    整形提升之后,如果任何一个操作数为unsigned long int类型,则将另一个操作数转换为unsigned long int类型。

    否则,如果任何一个操作数为long int类型且另一个操作数为unsigned int类型,则结果依赖于long int类型是否可以表示所有的unsigned int类型的值。如果可以,则将unsigned int类型的操作数转换为long int类型。如果不可以,则将两个操作数都转换为unsigned long int类型。

    否则,如果任何一个操作数为long int类型,则将另一个操作数转换为long int类型。

    否则,如果任何一个操作数为unsigned int类型,则将另一个操作数转换为unsigned int类型。

    否则,将两个操作数都转换为int类型。

    所以ANSI C采用的是值保留(value preversing)原则,尽量保证不会发生溢出。而K&R C的规则比较简单,采用的是无符号保留(unsigned preversing)原则。就是当一个无符号类型与int或更小的整形混合使用时,结果类型是无符号类型,这个规则简单,与硬件无关,但是有时会使一个负数丢失符号位。

    结合上例,在ANSI C编译器下,unsigned char的1被提升为int类型,所以if条件为真。但是在K&R C编译器下,由于<操作符右边是unsigned char类型,所以<操作符左边会转化为unsigned int,结果是unsigned int,所以if条件为假。

    这里提到K&R C标准,是为了说明在说明ANSI C类型转换时,有个对比。在实际项目中,应该都遵从ANSI C的规范,这样代码可最大限度地保证程序的可移植性。

    给出另一段C代码:

    int array[] = { 23, 34, 12,
    	17, 204, 99, 16
    };
    
    #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
    
    int main(void)
    {
    	int d = -1, x = 0;
    
    	if (d <= TOTAL_ELEMENTS - 2)
    		x = array[d+1];
    
    	printf("x=%d\n", x);
    	return 0;
    }
    复制代码

    根据标准C的规则,因为sizeof是unsigned类型,所以<=操作符左边会转化为unsigned,因此x=0.需要修正该问题,可以做如下改动:

    if (d <= (int)TOTAL_ELEMENTS - 2)
    		x = array[d+1];
    复制代码

    关于无符号类型的建议

    关于无符号类型的建议:

    尽量不要在你的代码中使用无符号类型,以免增加不必要的复杂性。尤其是,不要仅仅因为无符号数不存在负值(如年龄,国债)而用它来表示数量。

    尽量使用int那样的有符号类型,这样在涉及类型转换时,不必边界问题。

    只有在使用bit-field和二进制掩码时,才使用无符号数。应该在表达式中使用强制类型转换,使操作数均为有符号数或者无符号数,这样不必由编译器来选择结果的类型。

    关于ANSI C的整形提升的补充

    C语言中的类型转换比一般人想象中的要广泛的多。看个例子:

    printf("%d %d", sizeof('A'), sizeof(char));
    复制代码

    这行代码打印出存储一个字符类型的长度。结果都是1吗?

    实际的结果是4(32bit机器上)和1。字符常量'A'是char类型,由于sizeof('A')作为printf的参数,函数的参数也算是表达式,所以发生了转型提升。

    再看个实例:

    char c1, c2;
    ...
    c1 = c1 + c2;
    复制代码

    这里c1和c2都需要先进行整形提升,即转化为int,然后两个int值相加,最后对和的结果进行裁剪。

    参考:

    1. 《The C Programming Language中文版(第2版.新版)》
    2. 《C专家编程》

    转载于:https://juejin.im/post/5aeef2eb6fb9a07ab508cc85

    展开全文
  • 1. 字符串转无符号整型unsignedint 初始化一个字符串str;num用于存放当前转换的整型数,初始化为0。对字符串str中的每个字符进行判断,一旦扫描到当前字符在数字字符的范围之外,直接跳出循环。那么转换的整型数是...
  • 1.int类型C语言提供了许多整数类型,为什么一种类型...int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依计算机系统而异。一般而言,存储一个int要占用一个机器字长。因此,...
  • question2:无符号整型:u sizeof ( int ) ; //sizeof算出来的是4字节的无符号整形:4u int x = sizeof ( int ) ; //赋值过后会变成有符号数 x = 4; 若 for(int i = -4;i;++i) //打印不出来 因为有...
  • C语言无符号整数输入与输出

    千次阅读 2020-03-04 18:42:32
    输入两个无符号整数a, b, 用位操作实现无符号整数的乘法运算。不用考虑整数的溢出。 #include<stdio.h> int main() { unsigned int a,b; scanf("%u%u",&a,&b); a=a*b; printf("%u",a); return 0;...
  • int最大值,根据编译器...int的最大值为21474836473、可以通过打印sizeof(int)查看平台对应的int占用字节数,乘8后即为位数。最高位为符号位,如位数为n,则最大值为2^(n-1)即2的n-1次幂。扩展资料:得的C语言中in...
  • C语言无符号数赋值为负数时的%d%u输出问题解释

    千次阅读 多人点赞 2020-01-14 00:42:50
    文章目录问题发现什么是无符号整形补码的计算无符号整形的输出正确时:错误时:问题解决int用%d和%u输出unsigned int用%d和%u输出 问题发现 近日在练习过程中发现无符号整形数如果赋值为“-1”可以用%d进行输出,...
  • C语言笔记(符号

    2017-12-03 12:25:42
    注释符号 几个似非而是的注释问题 例子:(A) int / * ... * /i; (B) char * s = "abcdefgh //hijklmn"; (C) //Is it a \ valid comment? (D) in/ * ... * /t i;我们知道C语言里可以有两种注释方式:“/* */” 和 ...
  • 1. C语言的特点?①语言简洁、紧凑,使用方便、灵活。共有32个关键字,9种控制语句。②运算符丰富,公有34种运算符。③数据结构丰富,数据类型有:整型、实型、字符型、数组、指针、结构体、共用体等。④具有...
  • 从零开始学C语言@阆苑祁寒写在前面:本文从一个初学者的角度,给出了对C语言的简单理解。如有谬误,敬请指出!Week11 #include 2 int main(void)3 {4 printf("Hello, world! /n");5 return 0;6 }基本语法解释:stdio...
  • 1、有符号和无符号整型数据 C语言中定义的整型变量,默认都是有符号的,故关键字signed是可以省略不写的;但若是想要定义一个无符号的变量,则必须加unsigned关键 #include &lt;stdio.h&gt; void main()...
  • c语言显示输出变量的值的方法:首先创建一个c语言代码示例文件;然后在C语言中使用printf()输出多个变量值即可。本文操作环境:windows7系统、C11版、Dell G3电脑。c语言显示变量的值也就是输出变量值,在C语言中...
  • 递归实现:#include void binary_to_ascii(unsigned int value) { if((value/10) != 0) binary_to_ascii(value/10); printf("%c ",value%10+'0'); } int main() { unsigned int ret = ... binary_to_ascii(ret)
  • C语言3数据类型第3章 数据类型、运算符和表达式 常量——举例(求某商品总价) #define PRICE 100 //定义符号常量 void main() { int sum; sum=PRICE*20; printf("%d\n",sum); } 练习: 输入圆的半径,计算圆的周长和...
  • 从键盘上接收一个无符号整型值,然后按照顺序打印它的每一位.比如输入1234,就打印1 2 3 4. #define _CRT_SECURE_NO_WARNINGS #include #include void Print(int n){ if (n > 9){ Print(n / 10); } printf...
  • 本节主要讲C语言中的各种符号,包括注释符、单引号双信号以及逻辑运算符等。 一、注释符 注释符号和注释在程序的预编译期就已经被解决了,在预编译期间,编译器会将注释符号和注释符号之间的部分简单的替换成为空格...
  • C语言printf函数格式化打印之长整型

    万次阅读 2015-12-22 15:18:36
    有符号长整型 printf("recv %ld bytes audio data!\n", len); 无符号整型 printf("recv %lu bytes audio data!\n", len); 跟整型相比,就是在前面加个l
  • 考试大计算机等级站整理:2.3.1整型常量整型常量及整常数。它可以是十进制、八进制、十六进制数字表示的整数值。十进制常数的形式是:d i g i t ss这里d i g i t s可以是从0到9的一个或多个十进制数位,第一位不能是...
  • 数据类型:分为整形 , 浮点型整形: short int long longlong整型有无符号...无符号整型和有符号整型的区别就是无符号类型可以存放的正数范围比有符号整型中的范围大一倍,因为有符号类型将最高位储存符号,而无...
  • 前言 整型类型: c99标准下介绍
  • 1,整形:(默认有符号数) 在内存中存的是其对应二进制补码 char(存在内存中是其ASCLL码) short(短整型) int(整形) long(长整形) 2,浮点型: float double long double(不是所有编译器都支持) 3,构造类型...
  • % - 0 m.n l或h 格式字符下面对组成格式说明的各项加以说明:①%:表示格式说明的起始符号,不可缺少。②-:有-表示左对齐输出,如省略表示右对齐输出。③0:有0表示指定空位填0,如省略表示指定空位不填。④m.n:m指域宽...
  • 如果我们对无符号数和有符号数处理不当,就可能造成难以预测的结果,尤其是在作为循环条件的时候,可能导致死循环。整型之间的运算还可能导致出现另外一个问题-溢出。本文将分别介绍它们。 隐式类型转换 我们看...
  • /***********************************************//* *//* 将无符号整型值的每一位转化为字符并打印它 *//* xwlee 2006/12/4 *//***********************
  • arm处理器上,却是无符号。这里还是以arm架构为例,先来个没有任何争议的 n<1271234567891011121314151617181920212223int main(void){834c:e52db004push{fp}; (str fp, [sp, #-4]!)8350:e28db00...
  • 注:c99有一部分是对于增加了宽字符集,还加入了一些库函数,是继c89标准之后的第二个c语言官方标准。 首先测试各个类型在32位系统中占的字节数,测试代码如下: #include<stdio.h> int main() { int p; int...
  • 这其中涉及这样一种转换,表达式中的字符(32位一字节)和短整型(32位2字节)操作数在使用之前被转化为普通整形,这种转换称为整形提升。 2、整形提升的意义   表达式的整形运算要在CPU的相应运算器件内执行,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 14,864
精华内容 5,945
关键字:

c语言打印无符号整型

c语言 订阅