[C]x字符转义序列

摘要:
标准时间>intmain(void){chara='x123';范围外的十六进制转义序列[enabledbydefault]chara='x123';intmain(void){wchar_ta='x121';范围内的十六进制换行序列[enabledbydefault]wchar_ta='x123'';

概述

      x转义的定义是这样的

转义符字符值输出结果
xh[h...]具有此十六进制码的字符输出此字符

问题

     看似x后面可以接受1或n个十六进制的字符,但是如果你把一个超过ff分十六进制数赋值给一个char变量,会得到一个"Out of range"的提示;

#include <stdio.h>
#include <wchar.h>

int main(void)
{
    char a = 'x123';
    printf("%d
", a);
}
c28.c: In function ¡®main¡¯:
c28.c:10:11: warning: hex escape sequence out of range [enabled by default]
  char a = 'x123';

分析

     这是因为char类型只能容纳1byte的数,面对十六进制123是无能为力的,但是,即使是把char类型换成wchar_t类型,貌似也会有问题;

#include <stdio.h>
#include <wchar.h>


int main(void)
{
    wchar_t a = 'x123';
    printf("%d
", a);
}
c28.c: In function ¡®main¡¯:
c28.c:10:14: warning: hex escape sequence out of range [enabled by default]
  wchar_t a = 'x123';

     但如果用L预处理符号以表明一下这个/段字符是宽字符,就不会出现问题。这是因为声明字符变量时如果不表明该字面量是宽字符,编译器默认会当成窄字符去处理,而一个窄字符的大小只有1byte

#include <stdio.h>
#include <wchar.h>


int main(void)
{
    wchar_t a = L'x123';
    printf("%d
", a);
}
291

     当然,宽字符(也就是wchar_t类型)也有大小限制,这通常视系统而定,一般系统一个宽字符的大小是4byte。如果你输入的十六进制值大于4byte,那么编译器也会报"Out of range";

     另外,x跟字符位数无关,也就是说x61、x061和x000000061三者是一个意思

#include <stdio.h>
#include <wchar.h>

int main(void)
{
    char a = 'x0000000061';
    printf("%d
", a);
}
97

总结    

     x确实可以接受1或n个十六进制数,只是要看赋值变量类型是否匹配 

题外话

     其他语言跟C会有一点差异,例如在javascript和PHP,x只会接受前两位十六进制数,后面(要是有)则当普通字符处理。

免责声明:文章转载自《[C]x字符转义序列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇dva-loading使用boost的deadline_timer实现一个异步定时器下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【转】宽字节注入详解

前言在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。 首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到 &lt;meta charset=utf8&gt;...

DELPHI字符串、数组操作函数(转)

对字符串及数组的操作,是每个程序员必须要掌握的。熟练的使用Delphi的这些函数,在编程时能更加得心应手。   1.Copy   功能说明:该函数用于从字符串中复制指定范围中的字符。该函数有3个参数。第一个参数是数据源(即被复制的字符串),第二个参数是从字符串某一处开始复制,第三个参数是要复制字符串的长度(   即个数)。最后函数返回一个新的字符串(即是我...

ASCII码、HEX、字符、BCD 等等 基础知识思考

每每遇到这些问题就要想个半天,想不明白还不舒服,今天特别把所想整理下避免以后再次进入思想漩涡!!!计算机存储和传输都是以字节为单位1 bit = 1 二进制数据1 byte = 8 bit1 字母 = 1 byte = 8 bit1 汉字 = 2 byte = 16 bit1. bit:位一个二进制数据0或1,是1bit;2. byte:字节存储空间的基本...

hexdump——Linux系统的二进制文件查看工具

hexdump是Linux下的一个二进制文件查看工具,可以将二进制文件转换为ASCII、10进制、16进制或8进制进行查看。 首先我们准备一个测试用的文件test,十六进制如下: 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D...

C++ fscanf 读取一整行

scanf, fscanf很相似,都是从流中读取输入,然后赋值给变量 int scanf(const char *format, ...) int fscanf(FILE *stream, const char *format,...) %c 单一字符 %[] 一个字符集 * 输入项读入后跳过,不赋予任何变量 scanf, fscanf 自动跳过tabs和...

powershell初探(三)

  这篇将真正开始ps之旅,第一个要介绍的就是$(dolar),$是一个神奇的符号(不是因为他可以一折吃喝玩乐)   ps里当你需要一个临时的变量去存储结果(表达式的输出或者函数的返回值),那么就可以用"$"+变量名的形式去定义一个临时的容器。就像一个临时工一样,而临时工是无所不能的,可以在任何需要他们背黑锅的地方出现。临时变量也是一样,他可以接受任何类型...