不时有人在SO上指出char(也就是"字节")不一定是8位.
似乎8位char几乎是通用的.我原本认为,对于主流平台,必须有一个8位char才能确保其在市场上的可行性.
现在和历史上,哪些平台使用的char不是8位,为什么它们与"普通"8位不同?
在编写代码时,考虑跨平台支持(例如,对于通用库而言),对于非8位平台,值得考虑的是什么char?
在过去,我遇到过一些char16位的ADI DSP .我认为DSP是一种利基架构.(然后,当时手工编写的汇编程序很容易击败可用的C编译器可以做的事情,所以我在该平台上没有真正获得C的经验.)
我一直认为:
char由一个字节表示,sizeof (char)总是1,chars 计)是RAM的字节数(+交换空间).但是现在我已经阅读了维基百科条目,我不再那么肯定了.
我的假设中有哪一个是错的?哪一个是危险的?
在C++中,为什么bool需要一个字节来存储true或false,其中只有一个位足够,例如0表示false,1表示true表示?(为什么Java也需要一个字节?)
其次,使用以下内容会更安全多少?
struct Bool {
bool trueOrFalse : 1;
};
Run Code Online (Sandbox Code Playgroud)
第三,即使它是安全的,上述现场技术真的会有所帮助吗?因为我听说我们在那里节省空间,但是编译器生成的代码访问它们比访问基元所生成的代码更大更慢.
我知道C/C++标准只能保证每个字符最少 8位,理论上9/16/42 /其他任何东西都是可能的,因此所有关于编写可移植代码的网站都会警告不要假设8bpc.我的问题是"非便携式"这是真的吗?
让我解释.在我看来,有三类系统:
char不完全是 8位,我会感到非常惊讶.(如果我错了,请纠正我)char位数比8位多,我不会感到非常惊讶,但我还没有听说过一个这样的系统(如果我不知道的话,请再次通知我)底线:是否有共同的(大于%0.001)平台(在类别1和2以上),其中char是不是 8位?我的上述猜测是真的吗?
当我阅读以下摘录时,我正在研究计算系统的要素:
Hack计算机包括一个黑白屏幕,组织为256行,每行512像素.屏幕内容由8K存储器映射表示,该映射从RAM地址16384(0x400)开始.物理屏幕中的每一行,从屏幕的左上角开始,在RAM中由32个连续的16位字表示.因此,来自顶部的行r和来自左边的列c的像素被映射到位于RAM [16384 + r*32 + c%16]的字的c%16位(从LSB到MSB计数).为了写入或读取物理屏幕的像素,可以在RAM驻留存储器映射中读取或写入相应的位(1 =黑色,0 =白色).
那么,如果屏幕是256行512像素,并且每个像素是一个比特,那么整个屏幕的8K内存映射怎么样?
256行*512位= 131072/8位/字节/ 1024字节/ K = 16K
那不是一张16K的内存映射吗?
我唯一能想到的是因为字大小是16位,这可能是一个因素吗?我一直都知道"字节"意味着8位,但如果它的定义取决于计算机的字大小,那么这对我来说可能会解开这个谜团.有人可以向我解释该段中描述的屏幕是如何用8K内存映射而不是16K表示的吗?
我的问题可能会让你感到困惑,我知道两者都是不同的类型(signed char和char),但我的公司编码指南指定使用int8_t而不是char.
所以,我想知道,为什么我必须使用int8_t而不是char类型.有没有最好的做法int8_t?
我正在复习我的第一学期C++课程,我想我错过了一些东西.字符串占用多少字节?一个炭?
我们给出的例子是,一些是字符文字,一些是字符串:
'n', "n", '\n', "\n", "\\n", ""
我对那里的换行线的使用感到特别困惑.
我们都是便携式C/C++程序的粉丝.
我们知道sizeof(char)或sizeof(unsigned char)总是1"字节".但是1"字节"并不意味着具有8位的字节.它只是一个"机器字节",其中的位数可能因机器而异.看到这个问题.
假设您将ASCII字母"A"写入文件中foo.txt.这些天,在任何普通机器上都有一个8位机器字节,这些位将被写出来:
01000001
Run Code Online (Sandbox Code Playgroud)
但是如果要在具有9位机器字节的机器上运行相同的代码,我想这些位将被写出来:
001000001
Run Code Online (Sandbox Code Playgroud)
更重要的是,后一台机器可以将这9位写为一个机器字节:
100000000
Run Code Online (Sandbox Code Playgroud)
但是如果我们要在前一台机器上读取这些数据,我们就无法正常工作,因为没有足够的空间.不知何故,我们必须首先读取一个机器字节(8位),然后以某种方式将最后的1位变换为8位(机器字节).
程序员如何正确地协调这些事情?
我问的原因是我有一个编写和读取文件的程序,我想确保它不会在5年,10年,50年后中断.
在动态分配chars时,我总是这样做:
char *pCh = malloc(NUM_CHARS * sizeof(char));
Run Code Online (Sandbox Code Playgroud)
然而,我最近被告知,使用sizeof(char)是冗余和不必要的,因为"根据定义,a的大小char是一个字节",所以我应该/可以像这样编写上面的行:
char *pCh = malloc(NUM_CHARS);
Run Code Online (Sandbox Code Playgroud)
我的理解是char的大小取决于目标计算机上使用的本机字符集.例如,如果本机字符集是ASCII,则a char是一个字节(8位),如果本机字符集是UNICODE,char则必然需要更多字节(> 8位).
为了提供最大的可移植性,是不是必须使用sizeof(char),因为malloc只需分配8位字节?我误解malloc和sizeof(char)?
当fgetc用于读取流的下一个字符时,通常会检查是否未达到文件结尾
if ((c = fgetc (stream)) != EOF)
Run Code Online (Sandbox Code Playgroud)
哪里c是int类型.然后,文件结束已经达到并且条件将失败,或者c应该是unsigned转换为的char int,预期与EOF-c 不同,因为EOF确保为负.很好......显然.
但是有一个小问题......通常char类型不超过8位,而且int必须至少有16位,所以每个unsigned char都可以表示为int.然而,在这种情况下char会有16或32位(我知道,在实践中情况从来都不是这样......),没有理由为什么人们不能拥有sizeof(int) == 1,所以它(理论上!)可能fgetc (stream)返回EOF(或另一个负值)但文件结尾尚未达到......
我错了吗?如果没有达到文件结尾,C标准中是否会阻止fgetc返回EOF?(如果是的话,我找不到它!).或者if ((c = fgetc (stream)) != EOF)语法不完全可移植?...
编辑:的确,这是问题#3860943的重复.我在第一次搜索时没有找到这个问题.谢谢您帮忙!:-)