探究VC下的_T(""),发现:双字节字符/多字节字符是以小端存储的(至少是在VC2013环境下)

从VC6.0过渡到VS2013的程序员应该都会对字符的表现形式感到困惑,每每都要使用_T(""),才能如愿地显示字符。

其实_T("")是一个宏,起一个兼容的作用,使编译器采用默认的字符集形式(Ansi或Unicode)编译字符串。

在VC2013的 tchar.h 文件中,我提取出了部分代码,如下:

这部分代码非常直观,当采用Unicode字符集时,编译器就将_T("")中的字符串编译成Unicode形式,当采用Ansi字符集时,编译器就将_T("")中的字符串编译成Ansi形式。

再来说说字符集。

Windows下使用两种字符集,Unicode和Ansi。当前的Windows环境下,Unicode字符集以双字节形式储存,Ansi以单字节形式存储(也就是8位的char)。

据我了解,VC6.0编译器默认采用Ansi字符集,VS2010还是从哪一版本开始的,就默认采用Unicode字符集了。

至于为什么会有Unicode字符集,主要是因为8位的Ansi字符集最多可以表示256个字符,仅满足极少部分地区的使用要求,如英美,像我国等,汉字+符号,好多,256个字符远远不够。

值得一提的是,Unicode形式的字符竟是以小端存储的。不多说,见代码:

运行结果:

VS2013还不支持char16_t(C++11)!这段代码是在http://cpp.sh/上编译运行的的,这个网页很强大,对C++的新特性支持得也很好。

时间: 2024-10-20 19:19:03

探究VC下的_T(""),发现:双字节字符/多字节字符是以小端存储的(至少是在VC2013环境下)的相关文章

【菜鸟学php】小菜鸟由帝国备份王在Wamp环境下打开500错误浅谈PHP程序员

===================问题情况描述=================== 小弟一直在玩discuz论坛开源程序,这个论坛程序经常涉及到论坛搬家的问题. 今天我在本地Wamp环境下,用开源软件帝国备份王2010进行数据库备份数据,结果打开发现报错500! 这真是坑爹了,回想下以前自己使用这个开源程序进行备份也不下于十几次了,大部分都正常成功, 但也不乏出现这种情况的,小弟之前一般遇到这种问题, 都是直接忽略,换其他办法来进行备份,但是用惯了帝国备份王,换其他的方法备份数据,总感觉难

大端字节(Big endian)与小端字节(Little endian)

本文原创为freas_1990,转载请标明出处:http://blog.csdn.net/freas_1990/article/details/32752587 常见的80x86 CPU是先存放小值,再存放大值.这是小端字节(Little endian)序列. 而数字在互联网上传输的时候,是大端字节序列(Big endian).所以,网络编程里有一个api是htons(),用来将主机字节顺序转化成为网络字节顺序. 常见的CPU平台如下: 处理器 操作系统 字节顺序 Alpha 全部 little

字节顺序:大端模式和小端模式

?字节顺序有"大端模式" 和 "小端模式" 两种 ?字节顺序只是对内置数据类型而言,例如对于一整型(int,int 是内置数据类型)数,比如 0x123456 大端模式: 高地址---------->低地址 0x56 | 0x34 | 0x12 小端模式: 高地址 ---------->低地址 0x12 | 0x34 | 0x56  但对于字符串就没有大端和小端的说法(虽然字符是内置数据类型,但字符串不是),比如 "123456",不

主机字节序和网络字节序(大端序,小端序,网络序)

根据cpu的不同我们可以把主机字节序在内存中存储的顺序叫做主机序,也就是我们常说的,大端机和小端机.我们经常看到的有两种: 1.小端机(内存中以小端序存储的机器):将低字节序存储在开始的地址(及内存较小的内存) 2.大端机(内存中以大端序存储的机器):将高字节序存储在开始的的地址 举个例子:我们将内存从左到右排列:在内存中存放0x01020304              2000     2001    2002     2003 小 : 04             03         0

nodejs 修改端口号 process.env.PORT(window环境下)

各个环境下,nodejs设置process.env.PORT的值的命令,如下1.linux环境下: PORT=1234 node app.js 使用上面命令每次都需要重新设置,如果想设置一次永久生效,使用下面的命令. export PORT=1234 node app.js 2.windows下面按照顺序这样进行: set PORT=1234 node app.js window环境下,nodejs启动配置文件,基于package.json文件 { "name": "blog

我如何确定一个机器的字节顺序是大端还是小端?

通常的技巧是使用一个指针: int x = 1; if(*(char *)&x == 1) printf("little-endian\n"); else printf("big-endian\n"); 或者一个union: union { int i; char c[sizeof(int)]; } x; x.i = 1; if(x.c[0] == 1) printf("little-endian\n"); else printf(&qu

大端与小端,大尾与小尾,高尾端与低尾端,主机字节序与网络字节序

概念剖析 一时记忆与理解大端.小端的概念很容易,但时间一长,对于相似的概念人类的记忆向来是模糊的,甚至是换位的.所以除非你的记忆非常牢靠,否则借助大端和小端这样的名字,你很难将概念与内容联系紧密. 也有文章提到用大尾与小尾的概念,个人觉得这个概念还是没有解决存储概念中的基本问题,大与小还是没有脱离以前的概念,但是引入了尾的概念,已经比大端与小端要更清晰一点. 目前对于记忆大小端,我觉得这篇文章中提到的高尾端/低尾端名词记忆方法比较科学.形象.实话说,当时计算机科学著作翻译Big Endian与S

内存对齐,大端字节   序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是

内存对齐 大端字节,序小端字节序验证

空结构体:对于空结构体,就是只有结构体这个模子,但里面却没有元素的结构体. 例: typedef struct student { }std: 这种空结构体的模子占一个字节,sizeof(std)=1. 柔性数组: 结构体中最后一个元素可以是一个大小未知的数组,称作柔性数组成员,规定柔性数组前面至少有一个元素. typedef struct student { int i; char arr[];     //柔性数组成员 }std: sizeof(std)=4; sizeof求取该结构体大小是